c - 将参数传递给函数以有效地创建分配在堆栈上的数组

标签 c arrays performance

我有一个需要外部参数的函数,然后创建在该函数内部大量使用的变量。例如。代码可能如下所示:

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/

相关文章:

c - 使用 mingw32 在 Windows 上构建 glew 时 `DllMainCRTStartup@12' 的多个定义

javascript - 通过对每对值执行操作将两个数组组合成一个数组

performance - 为什么 Solr 比 Postgres 快这么多?

Java - 何时使用迭代器?

c - 内存竞技场和内存池有什么区别?

c - 十进制数的循环二进制

c - 如何访问结构体中的结构体数组?

python - 在庞大的数组中寻找最近的数组

c - 如何将真实文件夹添加到我的 Netbeans C 项目中?

arrays - seq<int> 和 array<int> 的区别