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

What is an efficient way to compile untyped arrays to C?

本文关键字:有效 方法 是什么 类型化 数组 编译      更新时间:2023-09-26

我正在从一种允许非类型化动态数组(如JavaScript)到C的语言编译代码。在其上表示这些数组的最佳方法是什么?例:

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

请注意缺乏适当的形状和大小。

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

由于缺乏静态大小,我不确定最好的方法是什么。

这通常是联合的用途; 至少,它们是最节省内存和时间的解决方案。使数组的每个条目都成为具有两个成员的结构:一个标记数据类型的整数,以及一个包含可能存储的所有可能类型的联合。

例:

struct typed_elem {
    int type;
    union {
        int32_t i;
        double f;
        char *s;
        struct typed_elem *a;
    } value;
};

这将允许数组包含整数、浮点数(双精度)、字符串或其他类似自身的数组。type成员将持有您编造的代码(您可能更喜欢使用enum而不是int)来告诉您的程序哪个工会成员处于活动状态。

您应该在 Javascript 中使用 ArrayBuffer (TypedArrays/ByteArrays) 来创建静态结构或通过 JSON 在两种语言之间传输数据。为了在 C 中使用动态结构,您需要为每个元素提供某种形式的标头,这将为您提供有关如何解析接下来的几个位的线索。

我的建议是使用类型化数组。这样,您就可以在C和Javascript中拥有相同的结构。