将无类型数组编译为C的有效方法是什么?

时间:2013-11-16 02:37:03

标签: javascript c++ c optimization compiler-construction

我正在从一种语言编译代码,该语言允许将无类型的动态数组(例如JavaScript)转换为C.在其上表示这些数组的最佳方法是什么?例如:

var array = [1,2,"test",[1,2]];
array.push([5]);

请注意缺少合适的形状和尺寸。

由于缺乏合适的形状,我认为在一个结构中装箱的所有内容都包含指向实际对象的指针。所以我可以有一个那个盒子的数组。 GCC是否能够拆箱,因此我没有性能损失,或者我应该寻找替代解决方案?

由于缺乏静态尺寸,我不确定最佳方法是什么。

2 个答案:

答案 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中拥有相同的结构。