【问题标题】:"Efficiency" of passing size_t as an argument将 size_t 作为参数传递的“效率”
【发布时间】:2011-02-04 07:08:01
【问题描述】:

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

【问题讨论】:

  • 为什么你认为 const 引用在 64 位系统上是 4 个字节?拥有 4 字节引用和 64 位 size_t 有什么意义?
  • 哦,哇,我不敢相信我忘记了。现在我想删除我的问题
  • size_t 将在哪些系统上为 64 位而指针为 32 位?
  • @templatetypedef,我还以为是ptrdiff_tsize_t 原则上可以在 64 位系统上为 32 位,但所有内存分配必须单独小于 4G。然而,这实际上并没有完成,因为你的寄存器无论如何都是 64 位的,所以它并没有真正为你买任何东西。
  • @bdonlan- 我的立场是正确的!我将 STL 容器内的嵌套类型 size_type 与 size_t 和 ptrdiff_t 混淆了,它必须足够大以容纳任何差异类型的绝对值。感谢您引起我的注意! @Mikel,我撤回我之前的声明,理由是它不正确。

标签: c++ size-t


【解决方案1】:

通常按值传递所有原始类型,因为复制它们所需的操作通常只是一条汇编指令。因此,通过值传递 size_ts 优于通过引用传递 size_ts。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 请注意sizeof(char*) 可能大于sizeof(size_t),例如在分段内存系统上,单个对象不能大于段的大小,但指针应该能够指向多个段。
    【解决方案3】:

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

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

    【讨论】:

    • 我想我在问这个问题时脑死了。不管怎样,你让我明白了这一点。我想我会在几分钟内删除这个问题。开个玩笑,我想我不能。
    • 别删了,其他人可能也有同样的问题 :) 反正有答案后原发帖人也不能删了。
    • 你不能删除它。就像人们花时间回答它一样。
    【解决方案4】:

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

    通过引用传递没有帮助;几乎可以肯定,指针至少与 size_t 一样大(如果不是,可以将 size_t 做得更小而不会出现问题)。无论如何,大多数 64 位 ABI 无论如何都会在 64 位寄存器中传递整数参数,因此堆栈占用空间没有区别。

    【讨论】:

      【解决方案5】:

      通过引用传递的问题在于,它需要编译器将值存储在内存中,并将该存储值的地址作为引用传递。在 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-26
        • 2020-09-18
        • 2015-05-24
        • 2012-11-10
        • 2020-10-30
        • 2014-02-25
        • 1970-01-01
        相关资源
        最近更新 更多