【问题标题】:What's the performance of the "address of" operator &?运算符&的“地址”有什么表现?
【发布时间】:2013-05-12 03:40:38
【问题描述】:

我必须在一个大循环中在我的代码中传递很多指针(所以我有很多表达式,比如foo(&x, &y, ...))。我想知道是否应该将指针存储为单独的变量(即缓存)以提高性能(以在我的代码中引入更多变量和混乱为代价)?

(做了很多矩阵运算,CUBLAS 库坚持使用指针...)

【问题讨论】:

  • 优化器可以比你更好地回答这个问题。
  • 这种宏优化不值得考虑。

标签: c++ performance addressof


【解决方案1】:

不——address-of 运算符与您希望的任何东西一样便宜/快速。 可能重载它,而这样的重载可能会更慢,但完全重载它是相当不寻常的。

【讨论】:

  • 如果地址操作符一直很慢,C就不会是现在这样,更不用说C++了。
  • + ,但你为什么说"overloading it at all is fairly unusual."
  • @GrijeshChauhan:嗯,希望它超载是一种邪恶的撒旦做法这一事实应该会阻止足够多的人这样做,从而使它变得不寻常。这似乎就是发生的事情。我当然不经常看到这样做。你呢?
  • @BenjaminLindley :) 你是正确的,因为我没有例子......谢谢!
【解决方案2】:

std::addressof 根本不会受到任何惩罚。当它归结为汇编代码时,无论如何我们只通过它们的地址来引用对象,因此信息已经在手边。

关于operator&,取决于它是否已经超载。原始的非重载版本的行为与std::addressof 完全相同。但是,如果 operator& 已被重载(无论如何这都是一个非常糟糕的主意,而且非常不受欢迎),那么所有的赌注都将失败,因为我们无法猜测重载的实现会是什么。

所以你的问题的答案是:不需要单独存储指针,你可以在需要时使用std::addressofoperator&,即使你必须重复它。

【讨论】:

    【解决方案3】:

    在 C++ 中有引用,您所描述的听起来更像是 C 语言而不是 C++ 的行为。

    这种 C++ 方法的签名通常是为了避免复制而实现的,默认情况下,当你调用一个方法并向它传递一些参数时,这个参数会生成一个本地副本,引用它是一种帮助你避免这种开销的技术副本。

    【讨论】:

      【解决方案4】:

      这将非常有效。如果您使用的是 Linux,则可以使用 objdump 进行检查。以下是 fooP(&var1, &var2) 在 x86 架构中的样子。它只不过是一条 LEA 指令。

       fooP(&var1, &var2);
       8048642:       8d 44 24 1c        lea    0x1c(%esp),%eax  -> this is to get the address of var2 to eax
       8048646:       89 44 24 04        mov    %eax,0x4(%esp)   -> this is to save the address to the stack for later fooP call
       804864a:       8d 44 24 18        lea    0x18(%esp),%eax  -> address of var1
       804864e:       89 04 24           mov    %eax,(%esp)
       8048651:       e8 be ff ff ff     call   8048614 <_Z4fooPPiS_>
      

      本例中的引用其实和上面一样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-27
        • 1970-01-01
        • 1970-01-01
        • 2014-03-23
        • 2017-05-23
        • 2022-01-23
        • 1970-01-01
        • 2011-05-31
        相关资源
        最近更新 更多