我有一个需要外部参数的函数,然后创建在该函数内部大量使用的变量。例如。代码可能如下所示:
void abc(const int dim);
void abc(const int dim) {
double arr[dim] = { 0.0 };
for (int i = 0; i != dim; ++i)
arr[i] = i;
// heavy usage of the arr
}
int main() {
const int par = 5;
abc(par);
return 0;
}
但是我遇到了编译器错误,因为堆栈上的分配需要编译时常量。当我尝试使用 _malloca 在堆栈上手动分配时,代码的时间性能恶化(与我在 abc() 函数中声明常量 par 的情况相比)。而且我不希望数组 arr 位于堆上,因为它应该只包含少量值并且它将在函数内部经常使用。有没有什么方法可以兼顾效率,同时保留将数组的大小参数传递给函数的可能性?
编辑:我正在使用 MSVC 编译器,但收到错误 C2131:表达式未计算为 VC 2017 中的常量。
最佳答案
如果您使用的是现代 C 编译器,它实现了整个 C99 或具有可变长度数组扩展的 C11,只需稍作修改即可:
void abc(const int dim);
void abc(const int dim) {
double arr[dim];
for (int i = 0; i != dim; ++i)
arr[i] = i;
// heavy usage of the arr
}
int main(void) {
const int par = 5;
abc(par);
return 0;
}
即double arr[dim]
会起作用——它没有编译时常量大小,但在运行时知道它的大小就足够了。但是,这样的 VLA 无法初始化。
不幸的是,MSVC 不是现代 C 编译器/在 MS,他们不想自己实现 VLA - 我什至怀疑他们是 VLA 被可选的重要原因C11,所以你需要在 main
中定义数组,然后将指向它的指针传递给函数 abc
;或者如果大小是全局常量,则使用实际的编译时常量,即 #define
。
但是,您没有显示出现性能问题的实际 代码。如果编译器知道迭代次数,则很可能可以生成优化的输出 - 如果这是真的,那么“全局定义的大小”可能是获得出色性能的唯一方法。
关于c - 将参数传递给函数以有效地创建分配在堆栈上的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45252531/