Tim*_*olz 0 c++ compiler-construction
我目前正在为我的编译器项目编写一个运行时,我想要通用且易于使用的结构来编码不同的类型(源语言是方案)。
我目前的做法是:
struct SObj {
SType type;
uint64_t *value;
};
Run Code Online (Sandbox Code Playgroud)
指针总是 64 位或 32 位宽,所以不应该将浮点数放入我的值中吗?然后,如果我想要浮点数的实际值,我只需要原始字节并将它们解释为浮点数。
提前致谢。
并不真地。
当您编写 C++ 时,您正在编程一个抽象。您正在描述一个程序。与流行的看法相反,它不是“全部只是字节”。
编译器很复杂。他们可以并且将会假设您遵守规则,并使用该假设生成最有效的“实际”代码(阅读:机器代码)。
这些规则之一是 auint64_t*是指向 a 的指针uint64_t。当您将任意位放入其中时——无论它们与形成 valid 的位相同float,还是其他什么——它不再是一个有效的指针,并且简单地评估它具有未定义的行为。
有一些语言工具可以做你想做的事,比如union. 但是您必须小心不要违反别名规则。您将存储一个标志(大概,这就是您的标志type),告诉您union您正在使用哪个成员。让生活更轻松并拥有一个std::variant替代品,它可以为您完成所有这些工作。
话虽如此,您可以 std::memcpy/ std::copybits in 和 copy bits out,例如 auint64_t只要它们是您在系统上选择的类型的有效表示。只是不要期望reinterpret_cast有效:它不会。