经验法则是,按值传递小结构是可以的,而较大的结构应该是指针。
我的问题是这个截止点究竟在哪里?在你最好通过指针传递结构之前,结构有多大。
我知道这会因平台而异,但我假设可以给出一些粗略的估计。一两年前,我试图在PPC架构上弄清楚这一点,并且令我惊讶的是,人们可以通过价值有效地传递大量数据。由于PPC中存在大量寄存器,因此认为10个左右的值很合适。通过指针实际上涉及更多的内存复制。
然而,我现在处于英特尔,我希望事情可能会有所不同。由于CPU传统上没有那么多寄存器,但可能在64位或浮点寄存器上有所不同?
答案 0 :(得分:4)
好的,所以我尝试遵循建议并使用指针和值来描述我的代码。我还看了汇编代码。似乎x86上的性能特征与PPC完全不同。在PPC上,C的二进制接口指定参数将被放入寄存器(有很多可供选择),但似乎即使在64位x86上也需要将参数放在堆栈上。
这就解释了为什么在x86上通过指针传递似乎总是更快。但是我注意到编译器非常渴望内联。所以我做到了这一点无关紧要。所以我猜结论是使用对你来说方便的任何传递。
我认为有利于价值传递,因为处理价值副本更安全一些。我的测试用例是一个由4个双精度组成的结构(所以我想这在大多数平台上都是32字节)。
答案 1 :(得分:3)
如果您在网上搜索,您会找到一些关于字节大小的指南,以便通过引用和值传递。我几乎都不相信它。 知道特定结构是一个问题的唯一方法是
简介
这是100%知道存在问题的唯一方法。
在反对者进入之前。是的,那里有一些明显的案例。例如,如果说有100个成员,我就不会按值传递结构。但这不是针对性能问题,而是针对堆栈空间问题。
答案 2 :(得分:2)
在C ++中,规则是将所有不在以下列表中作为const
引用传递,因为性能基本上不会更糟。例外列表是:
int
等),我不确定这是否可以直接应用于C(除了C没有的明显类型),但可能适用类似的指南。
答案 3 :(得分:1)
某些编译器可能会为您确定最佳尺寸。如果我没记错的话,如果结构超过一定的大小,TI28xx编译器会自动将pass by value转换为引用传递。
答案 4 :(得分:0)
不要忽视对齐在测试中扮演的角色。如果您正在传递浮动或双重并且您的结构未在适当的边界上对齐,则处理器可能会取出您的部分值,移动它,然后在存储它之前对其余部分进行OR运算。我认为大多数现代编译器都是DTRT(通过在声明时对齐结构),但如果你正在优化空间,那么这可能是一个问题。
嗯,现在我考虑过这个问题,因为我从Pentium Pro开始就没有在x86拱门上进行过任何低级编码了,所以我可以考虑一下这个问题。
答案 5 :(得分:-1)
通常原始类型我通过值传递,其他所有通过引用传递。 这是我的经验法则。