我正在将代码从一种允许无类型的动态数组(例如 JavaScript)的语言编译为 C。在其上表示这些数组的最佳方式是什么?示例:
var array = [1,2,"test",[1,2]];
array.push([5]);
注意缺少适当的形状和大小。
由于缺乏适当的形状,我曾考虑将所有内容装箱在一个结构中,其中包含指向实际对象的指针。所以我可以有一个那个盒子的数组。 GCC 是否能够拆箱,这样我就没有性能损失,或者我应该寻找替代解决方案?
由于缺少静态大小,我不确定最好的方法是什么。
最佳答案
这通常是 union 的目的;至少,它们是最节省内存和时间的解决方案。使数组的每个条目成为一个具有两个成员的结构:一个标记数据类型的整数,以及一个包含您可能存储的所有可能类型的 union 。
例子:
struct typed_elem {
int type;
union {
int32_t i;
double f;
char *s;
struct typed_elem *a;
} value;
};
这将允许您的数组包含整数、 float ( double )、字符串或类似本身的其他数组。 type
成员将保存一个代码(您可能更喜欢使用 enum
而不是 int
)来告诉您的程序是哪个成员 union 活跃。
关于javascript - 将无类型数组编译为 C 的有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20013949/