传递size_t作为参数的“效率”

时间:2011-02-04 07:08:01

标签: c++ size-t

由于size_t可以是32位或64位,具体取决于当前系统,最好总是将size_t作为参考或const引用传递给函数,因此它总是4个字节? (如果它是8个字节你必须复制)我看过很多开源代码都没有这样做,但是如果他们的编译器支持64位整数,那些64位整数总是作为引用传递。他们为什么不为size_t这样做呢?我想知道你的意见是什么。

5 个答案:

答案 0 :(得分:13)

按惯例传递所有基本类型,因为复制它们所需的操作通常只是一个汇编指令。因此,通过值size_t传递size_t比使用{{1}}引用更为可取。

答案 1 :(得分:6)

在大多数实现size_t上,指向对象的指针和对象的引用完全相同。

可以这样考虑:size_t可以保存任何对象的大小,并且可以使用char*来处理任何对象中的任何字节,因此它意味着size_t和{{1必须具有密切相关的大小。因此,在大多数实现中,您的想法毫无意义。

答案 2 :(得分:3)

我没有完全遵循你的逻辑。如果通过引用传递,那么地址将是32位或64位,具体取决于当前系统。

无论如何,我认为通过引用传递它没有任何好处。

答案 3 :(得分:3)

保证

size_t能够保存您可以在内存中分配的任何对象的字节大小。这通常意味着它与指针的大小相同,而指针又通常是CPU寄存器的大小。

通过引用传递没有帮助;一个指针几乎肯定至少和size_t一样大(如果没有,size_t可以变小而没有问题)。在任何情况下,大多数64位ABI无论如何都会在64位寄存器中传递整数参数,因此堆栈占用空间没有差别。

答案 4 :(得分:3)

通过引用传递的问题是它需要编译器将值存储在内存中并将该存储值的地址作为引用传递。在64位体系结构中,调用约定允许在寄存器(6个寄存器)中传递更多信息,而不必将值存储在内存中,因此您可以通过引用传递小值来禁止优化。

此问题还有更多内容,您可以从以下开始:

http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/

http://en.wikipedia.org/wiki/X86_calling_conventions#x86-64_Calling_Conventions