C++ &引用;效率“;作为参数传递大小\u t

C++ &引用;效率“;作为参数传递大小\u t,c++,size-t,C++,Size T,由于size\u t可以是32位或64位,具体取决于当前系统,因此最好始终将size\u t作为引用或常量引用传递给函数,使其始终为4字节?(如果是8字节,你就必须复制)我看过的很多开源代码都不这样做,但是如果他们的编译器支持64位整数,那么这些64位整数总是作为引用传递。为什么他们不为尺码做这个?我想知道您的看法。通常按值传递所有基元类型,因为复制它们所需的操作通常只是一条汇编指令。因此,通过值传递size\u ts比通过引用传递size\u ts更可取。我没有完全遵循您的逻辑。如果通过引用传

由于
size\u t
可以是32位或64位,具体取决于当前系统,因此最好始终将size\u t作为引用或常量引用传递给函数,使其始终为4字节?(如果是8字节,你就必须复制)我看过的很多开源代码都不这样做,但是如果他们的编译器支持64位整数,那么这些64位整数总是作为引用传递。为什么他们不为尺码做这个?我想知道您的看法。

通常按值传递所有基元类型,因为复制它们所需的操作通常只是一条汇编指令。因此,通过值传递
size\u t
s比通过引用传递
size\u t
s更可取。

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


无论如何,我看不出通过引用传递它有什么好处。

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


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

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


可以这样想:
size\u t
可以容纳任何对象的大小,并且可以使用
char*
来寻址任何对象中的任何字节,因此这意味着
size\u t
char*
必须具有密切相关的大小。因此,您的想法在大多数实现中毫无意义。

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

这个问题还有很多,您可以从以下几点开始:


为什么您认为常量引用在64位系统上是4字节?有4字节的引用和64位的大小有什么意义呢?哦,哇,我真不敢相信我忘了。现在我想删除我的问题:什么系统的
size\u t
是64位,指针是32位?@templatetypedef,我想那是
ptrdiff\u t
<在64位系统上,code>size\t原则上可以是32位的,但所有内存分配必须分别小于4G。然而,实际上并没有做到这一点,因为您的寄存器是64位的,所以它并不能真正为您买任何东西。@bdonlan-我的观点是正确的!我把STL容器内部的嵌套类型size\u type与size\u t和ptrdiff\u t混淆了,它必须足够大以容纳任何差异类型的绝对值。谢谢你引起我的注意@米克尔,我收回我之前的陈述,理由是它是不正确的。我想我在问这个问题时脑死亡了。不管怎样,你让我意识到了这一点。我想我会在几分钟后删除这个问题。只是开玩笑,我想我不能。不要删除它,其他人可能会有相同的问题:)而且无论如何,在有答案后,用原始海报删除是不可能的。你不能删除它。因为人们已经花了时间来回答这个问题,所以也一样。请注意,
sizeof(char*)
可以大于
sizeof(size\u t)
,例如,在分段内存系统上,单个对象不能大于段的大小,但指针应该能够指向多个段。