我正在从一种语言编译代码,该语言允许将无类型的动态数组(例如JavaScript)转换为C.在其上表示这些数组的最佳方法是什么?例如:
var array = [1,2,"test",[1,2]];
array.push([5]);
请注意缺少合适的形状和尺寸。
由于缺乏合适的形状,我认为在一个结构中装箱的所有内容都包含指向实际对象的指针。所以我可以有一个那个盒子的数组。 GCC是否能够拆箱,因此我没有性能损失,或者我应该寻找替代解决方案?
由于缺乏静态尺寸,我不确定最佳方法是什么。
答案 0 :(得分:2)
这通常是工会的用途;至少,它们是最节省时间和时间的解决方案。使数组的每个条目成为一个包含两个成员的结构:一个标记数据类型的整数,以及一个包含您可能存储的所有可能类型的联合。
示例:
struct typed_elem {
int type;
union {
int32_t i;
double f;
char *s;
struct typed_elem *a;
} value;
};
这将允许您的数组包含整数,浮点(双精度),字符串或其他类似的数组。 type
成员会保留一段代码(您可能更愿意使用enum
代替int
),以便告诉您的程序哪个成员的成员有效。
答案 1 :(得分:0)
您应该在Javascript中使用ArrayBuffer(TypedArrays / ByteArrays)来创建静态结构或通过两种语言之间的JSON传输数据。为了在C中使用动态结构,您需要为每个元素提供某种形式的标题,以便为您提供如何解析下几位的线索。
我建议使用Typed Arrays。这样你就可以在C和Javascript中拥有相同的结构。