【问题标题】:Does GCC optimize std::tie used only for readability?GCC 是否优化 std::tie 仅用于可读性?
【发布时间】:2015-05-13 10:35:00
【问题描述】:

假设我有一个std::tuple:

std::tuple<int,int,int,int> t = {1,2,3,4};

我想使用std::tie 只是为了这样的可读性目的:

int a, b, c, d; // in real context these names would be meaningful
std::tie(a, b, c, d) = t;

对比只是使用t.get&lt;int&gt;(0)等。

GCC 会优化此元组的内存使用,还是会为a, b, c, d 变量分配额外空间?

【问题讨论】:

  • 何不试试呢? (顺便说一句,它可能会。)
  • 查看godbolt。简短的回答:举个简单的例子,是的。通过tie()get&lt;N&gt;() 对元组中的元素求和会产生相同的程序集。
  • 有什么理由为什么需要将一个可以独立确定的经验答案的问题提交到互联网问答网站?
  • @EJP 我觉得这个问题有更多的维度,了解什么是围绕相对较新的 C++ 结构的有效优化以及即使优化是有效的,是否可以期望编译器执行该优化。元组引入了一些有趣的权衡,这有点超出了这个问题的范围,但是在某些更复杂的情况下,编译器没有进行明显的优化。

标签: c++ c++11 optimization tuples tie


【解决方案1】:

在这种情况下,我看不出有什么理由不这样做,在as-if rule 下,编译器只需要模拟程序的可观察行为。快速实验using godbolt

#include <tuple>
#include <cstdio>

void func( int x1, int x2,int  x3, int x4)
{
  std::tuple<int,int,int,int> t{x1,x2,x3,x4};

  int a, b, c, d; // in real context these names would be meaningful
  std::tie(a, b, c, d) = t;

  printf( "%d %d %d %d\n", a, b, c, d ) ;
}

表明 gcc 确实优化了它:

func(int, int, int, int):
    movl    %ecx, %r8d
    xorl    %eax, %eax
    movl    %edx, %ecx
    movl    %esi, %edx
    movl    %edi, %esi
    movl    $.LC0, %edi
    jmp printf

另一方面,如果您使用t 的地址并将其打印出来,我们现在可以观察到依赖于现有t 的行为(see it live):

printf( "%p\n", static_cast<void*>(&t) );

我们可以看到 gcc 不再优化 t:

movl    %esi, 12(%rsp)
leaq    16(%rsp), %rsi
movd    12(%rsp), %xmm1
movl    %edi, 12(%rsp)
movl    $.LC0, %edi
movd    12(%rsp), %xmm2
movl    %ecx, 12(%rsp)
movd    12(%rsp), %xmm0
movl    %edx, 12(%rsp)
movd    12(%rsp), %xmm3
punpckldq   %xmm2, %xmm1
punpckldq   %xmm3, %xmm0
punpcklqdq  %xmm1, %xmm0

归根结底,您需要查看编译器生成的内容并分析您的代码,在更复杂的情况下,它可能会让您感到惊讶。仅仅因为允许编译器进行某些优化并不意味着它会这样做。我已经研究了更复杂的情况,其中编译器没有按照我对std::tuple 的预期执行。 Godbolt 在这里是一个非常有用的工具,我无法计算我曾经有多少优化假设被插入到 Godbolt 中的简单示例所颠覆。

注意,我通常在这些示例中使用printf,因为 iostreams 会生成大量妨碍示例的代码。

【讨论】:

  • 没有意识到你可以分享godbolt的例子。这是mine
  • @Barry 很高兴你学到了一些新东西,我觉得这是一个必不可少的功能,不能分享这样的例子会降低它的用处。这就是 SO 的厉害之处,它总是在学习新东西。
  • 我觉得你回答中最重要的信息是最后一段。
  • 我发现使用 -fdump-tree-optimized 生成的文件比 asm 更易于进行高级优化。
  • @MarcGlisse 这很公平,虽然我们can do it via Coliru.
猜你喜欢
  • 2014-09-26
  • 2014-04-15
  • 2017-03-08
  • 2022-10-01
  • 2015-11-29
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 2017-04-16
相关资源
最近更新 更多