【问题标题】:What would the compiler do in this situation? [closed]在这种情况下编译器会做什么? [关闭]
【发布时间】:2013-11-25 20:49:35
【问题描述】:

我想知道这个问题:

如果您的程序中有以下代码行,编译器将如何修改您的源代码以使其更高效?

int z = max(x,y);  // assume that x and y are of type int

给定这个函数:

inline int max (int a, int b)
{
  return (a > b) ? a : b;
}

【问题讨论】:

  • 听起来像是一个缺少上下文的家庭作业问题。
  • 这在很大程度上取决于很多事情。如果从未使用过z,它将摆脱整行。您没有提供足够的信息来建议编译器可能会做什么。
  • 我猜是int z = unicorn(x,y);(如果你用-Dmax=unicorn编译的话)
  • 我认为更大的问题是 Brian Boitano 会做什么?

标签: c++ optimization compiler-construction


【解决方案1】:

不会的。编译器不修改源代码;他们只是从源代码生成目标代码。

假设max 一开始是这样的:

int max(int a, int b) { 
    return b < a ? b : a; 
}

...很有可能(至少在支持它的架构上1),一个好的编译器会生成如下代码:

    mov eax, a
    mov ebx, b
    cmp eax, ebx
    jl  do_ret
    mov eax, ebx
do_ret:
    ret

其中,就源代码而言,对应的东西更像这样:

int ret = a;
if (b < ret)
    ret = b;
return ret;

这样做的主要优点是它只需要 if/then,而不需要 if/then/else。后者通常需要至少一个额外的分支来分别执行两个分支,然后将执行流程重新组合在一起。


1.在这种情况下,支持它很容易。在少数情况下,您会遇到最容易进行比较的情况,然后加载一个值作为默认值,然后根据比较结果进行分支。这需要一种架构,其中标志被负载修改。例如,在 x86 上确实如此,但在其他许多上却不是(想到 68K,虽然我的记忆太长了,我无法相信我的记忆)。

【讨论】:

  • 不是cmov 更有可能吗?
  • @Oak:这当然是完全有可能的,但是(与我上面提到的不同)与不同的源代码并没有真正密切对应(我将其解释为他的问题是主要是关于)。
【解决方案2】:

这是一种微优化,通常性能提升可以忽略不计。

取决于max() 的声明和目标汇编语言。

如果max()定义为:

#define max(a,b) ((a) < (b) ? (a) : (b))

函数可以优化为:

z = b;
if (b < a)
{
  z = a;
}

如果您的处理器有条件指令,那么它可以优化为:

COMPARE A, B;
MOV Z,B IF A LT B
MOV Z,A IF B LT A

【讨论】:

  • 给定这个函数定义
  • 内联 int max (int a, int b) { return (a > b) ?一:乙; }
猜你喜欢
  • 2016-02-29
  • 2017-12-24
  • 1970-01-01
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多