gpt4 book ai didi

c - 在 C 中按值传递参数 : how big is too big?

转载 作者:行者123 更新时间:2023-12-02 18:50:50 28 4
gpt4 key购买 nike

我很想知道经验丰富的 C 程序员认为可以按值传递的参数大小的上限是什么。

上下文:我有机会使用 2×2 矩阵,它位于一个结构体中:

typedef struct
{
double a, b, c, d;
} mat_t;

现在,如果我可以按值传递,特别是对于复合操作,生活会变得更加容易很多

mat_t A = mat_sum(mat_smul(lambda, B), C);
例如,

对于 A = λB + C。同时,我知道按值传递涉及将内容复制到运行时堆栈,因此如果这些内容很大,就会产生成本。

C 语言标准库按值传递复数表明“两个 double ”是合理的下界,但也是合理的上限?

最佳答案

这是相当主观的,但总的来说它是这样的:

每个人都普遍认为“原始数据类型”(整数、浮点、指针等)可以按值传递。在合理范围内,如果您有超过 5 个左右的参数,那么也许您应该使用结构体。

一些程序员认为,如果结构只包含一些这样的原始数据类型,那么它们就可以按值传递。或者至少只要将结构大小保持在 CPU 的数据字大小以下即可。其他人则更严格,认为结构体无论大小都应始终通过引用传递,因为这使您的编码风格保持一致,而且还因为与通过指针间接访问参数相比,性能差异不大。直接访问局部变量。不过,如果函数无法内联,将数据复制到堆栈总是会影响性能。

不过,没有明显的对错,因为这归结为系统调用约定和堆栈帧格式。

每个人都普遍认为不应在堆栈上分配巨大的数组或结构,因为存在堆栈溢出的可能性。 “巨大”可能意味着 100 个字节,也可能意味着数千个字节,这同样取决于系统。

如果查看只有几个通用寄存器和非常有限的堆栈的最低端系统,那么在某些情况下,您必须将所有参数烘焙到一个结构中并通过引用传递该参数,以加快速度函数调用并减少堆栈使用。

关于c - 在 C 中按值传递参数 : how big is too big?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66814544/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com