c - 有多大的结构可以有效地按值传递?

标签 c performance optimization struct pointers

经验法则是按值传递小结构是可以的,而较大的结构应该用指针传递。

我的问题是这个分界点到底在哪里?在您最好通过指针传递结构之前,结构可以有多大。

我知道这会因平台而异,但我假设可以给出一些粗略的估计。一两年前,我试图在 PPC 架构上弄清楚这一点,令我惊讶的是,它可以按值有效地传递相当多的数据。由于 PPC 中的大量寄存器,认为 10 个左右的 double 值就可以了。通过指针实际上涉及更多的内存复制和复制。

不过,我现在使用的是英特尔,我希望情况会有所不同。由于 CPU 传统上没有那么多寄存器,但也许这在 64 位或浮点寄存器上有所不同?

最佳答案

好的,所以我试着听从建议并使用指针和值来分析我的代码。我还看了汇编代码。看起来 x86 上的性能特征与 PPC 有很大不同。在 PPC 上,C 的二进制接口(interface)指定将参数放入寄存器(有很多可供选择),但似乎即使在 64 位 x86 上也需要将参数放入堆栈。

这就解释了为什么在 x86 上通过指针传递似乎总是更快。但是我注意到编译器非常渴望内联。所以我以何种方式做到这一点并不重要。所以我想结论是使用对您来说方便的任何传递。

我认为这有利于按值传递,因为处理值的副本更安全。我的测试用例是一个由 4 个 double 组成的结构(所以我猜这在大多数平台上都是 32 字节)。

关于c - 有多大的结构可以有效地按值传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/858424/

相关文章:

c - Tizen nativ 可穿戴开发错误找不到二进制文件(/Users/yvonne/CeBIT/CeBIT/Debug/cebit)

c - 如何将程序链接到具有相同函数名称但不同实现的两个库?

javascript - 以什么顺序声明变量和函数?

c - 如何有效地引用count cons cells(检测周期)?

php - 如何在使用 filter_input 的同时检查 POST 和 GET 数据?

c++ - 以下语句中逗号的作用是什么?

c - *ip 的值打印为其指向的变量的地址

performance - 如何在映射带有子 slice 的结构时降低时间复杂度?

python - copy.copy 与 copy.deepcopy 在元组上的性能

java - 从 Iterator<?> 返回相同的对象