由于size_t
根据当前系统可以是 32 位或 64 位,最好总是将 size_t 作为引用或 const 引用传递给函数,因此它总是 4 个字节?(如果它是 8 个字节,则必须复制)我看过的许多开源代码都不会这样做,但是如果他们的编译器支持 64 位整数,那么这些 64 位整数总是作为引用传递。他们为什么不为 size_t 这样做?我想知道你的意见是什么。
5 回答
通常按值传递所有原始类型,因为复制它们所需的操作通常只是一条汇编指令。因此,通过值传递size_t
s 优于通过size_t
引用传递 s。
在大多数实现size_t
中,指向对象的指针和对对象的引用的大小完全相同。
可以这样想:size_t
可以容纳任何对象的大小,并且可以char*
用来寻址任何对象中的任何字节,因此它意味着size_t
并且char*
必须具有密切相关的大小。因此,您的想法在大多数实现中毫无意义。
我没有完全按照你的逻辑。如果您通过引用传递,则地址将是 32 位或 64 位,具体取决于当前系统。
无论如何,我认为通过引用传递它没有任何好处。
size_t
保证能够保存您可以在内存中分配的任何对象的大小(以字节为单位)。这通常意味着它与指针的大小相同,而指针通常又是 CPU 寄存器的大小。
通过引用传递没有帮助;几乎可以肯定,指针至少与 size_t 一样大(如果不是,可以将 size_t 做得更小而不会出现问题)。无论如何,大多数 64 位 ABI 在 64 位寄存器中传递整数参数,因此堆栈占用空间没有区别。
通过引用传递的问题是它需要编译器将值存储在内存中并将该存储值的地址作为引用传递。在 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