【问题标题】:What is an efficient way to compile untyped arrays to C?将无类型数组编译为 C 的有效方法是什么?
【发布时间】:2013-11-16 02:37:03
【问题描述】:

我正在将代码从一种允许无类型、动态数组(例如 JavaScript)的语言编译为 C。在上面表示这些数组的最佳方式是什么?示例:

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

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

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

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

【问题讨论】:

  • 在 c++ 中 boost::variant 是一个常见的解决方案。如果 c++ 不是一个选项,您可能需要删除 c++ 标记
  • @Jesse 不错。不过,它会成为一个好的编译目标吗?
  • 是的,我想没问题。

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


【解决方案1】:

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

例子:

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

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

【讨论】:

  • 谢谢,你能稍微扩展一下吗?您对“以及包含您可能存储的所有可能类型的联合”是什么意思?一个简单的例子会很棒......编辑:哦,我现在明白了。我认为这行不通,因为我也不知道嵌套类型的大小(想象一个数组,它有一个数组,一个数组,等等......)
【解决方案2】:

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

我建议使用Typed Arrays。这样你就可以在 C 和 Javascript 中拥有相同的结构。

【讨论】:

  • 这不是我的意思,数组可以保存不同类型的事实是必要的(它不是 JavaScript,它只是一个示例)。不过,我很感激这些信息!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-21
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多