实现符号表来存储不同类型 C++ 的值
Implementing a symbol tables to store values for different types C++
我正在用 C++ 实现编译器,目前处于 AST 阶段。我现在需要在 symbol_entry 中添加该变量的值(它已经有类型)。但是,当我不知道类型时,如何在 class 的属性中保留不同大小的值。我目前的想法是在 symbol_entry 中声明一个类型为 void* 的属性“val_pointer”,然后将例如从 int* 转换为 void* 并返回。我的理解是,这是可以做到的,因为指针的大小都是一样的。这行得通吗?而且,这种每次都单独分配一个 int* 的方式是否有效?我认为如果我从连续的内存块存储创建这些 int* 会更好,但我也想保存 space。
一种解决方案是使用 tagged unions。例如:
enum Type
{
tInt,
tDouble
};
struct Data
{
Type type;
union
{
int Int; // only valid when type is tInt
double Double; // only valid when type is tDouble
} as;
};
请注意,这不是 C++ 中可用的最佳解决方案。您可能需要查看 std::variant, which has some advantages when compared to a raw tagged union, see .
另一种方法可能是拥有一个 class 层次结构,其中每个数据类型都继承自一个基本 Object
类型。
我正在用 C++ 实现编译器,目前处于 AST 阶段。我现在需要在 symbol_entry 中添加该变量的值(它已经有类型)。但是,当我不知道类型时,如何在 class 的属性中保留不同大小的值。我目前的想法是在 symbol_entry 中声明一个类型为 void* 的属性“val_pointer”,然后将例如从 int* 转换为 void* 并返回。我的理解是,这是可以做到的,因为指针的大小都是一样的。这行得通吗?而且,这种每次都单独分配一个 int* 的方式是否有效?我认为如果我从连续的内存块存储创建这些 int* 会更好,但我也想保存 space。
一种解决方案是使用 tagged unions。例如:
enum Type
{
tInt,
tDouble
};
struct Data
{
Type type;
union
{
int Int; // only valid when type is tInt
double Double; // only valid when type is tDouble
} as;
};
请注意,这不是 C++ 中可用的最佳解决方案。您可能需要查看 std::variant, which has some advantages when compared to a raw tagged union, see
另一种方法可能是拥有一个 class 层次结构,其中每个数据类型都继承自一个基本 Object
类型。