【问题标题】:Optimize initialization of C array with expressions使用表达式优化 C 数组的初始化
【发布时间】:2012-01-03 03:26:31
【问题描述】:

我正在做一个程序转换,从允许在数组初始值设定项中使用表达式的语言到 C99,而 C99 不允许。

目前,我处理此问题的方式是创建一个 __arrayInit 函数,然后在其中生成大量此类:

array[0] = x + y * z; // Sample Expression
array[1] = a / b + c; // Another
array[2] = 5; // sometimes there's a constant
...

通常有数百个这样的单独初始化。有没有更好的执行速度更快的方法?如果它的编译速度也更快,那就谢了。

编辑:表达式有时是非常量的,其中可以包含变量和函数调用。

【问题讨论】:

  • Constant 表达式允许在数组初始值设定项中使用。
  • 您的数组是静态的还是在函数内部定义的?在后一种情况下,C99 中允许使用非常量初始值设定项,这里是来自 GCC 文档的an example
  • @p.kolya,函数范围内允许任何表达式。
  • 这是一个结构中的指针,它在 __arrayInit 函数中被 malloc'd。
  • 不要期望速度。对于每个元素,它必须评估表达式然后存储它。不管怎么做都是这样。

标签: c arrays optimization


【解决方案1】:

C99 允许在初始化程序中使用表达式

int sarray[] = {
   [0] = x + y * z, // Sample Expression
   [1] = a / b + c, // Another
   [2] = 5, // sometimes there's a constant
};

是有效的语法。

编辑: 如果它是 auto 变量,则允许其类型与数组基类型的赋值兼容的任何表达式。

对于具有static 存储类的数组(全局数组或使用static 额外声明的局部数组),您可以使用由以下组成的常量表达式:

  • 任何类型的文字,例如231E-45"hello"
  • 枚举常量
  • 全局变量或函数的地址常量

工作的是const限定变量。

【讨论】:

  • 这些必须等同于常数吗?
  • @SamWashburn:仅当数组在全局范围内时。如果它在函数范围内,则允许其类型与数组基类型的赋值兼容的任何表达式。
  • @JensGustedt 在 c99 中,如果在函数范围内但使用 static 存储说明符,则初始化程序也必须是常量表达式。在 c89 中,聚合或联合类型的初始值设定项始终必须是常量表达式(即使存储持续时间是自动的)。
  • @ouah,重新表述为存储类。对于 C89 也是正确的,但问题明确谈到了 C99。
  • s/function scope/block scope/ 在我的上一条评论中
猜你喜欢
  • 1970-01-01
  • 2019-11-02
  • 2013-08-22
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 2021-01-07
  • 2023-03-13
相关资源
最近更新 更多