【发布时间】:2011-08-11 12:28:03
【问题描述】:
上述主题让我在if 条件下对bool 和int 做了一些实验。所以出于好奇,我写了这个程序:
int f(int i)
{
if ( i ) return 99; //if(int)
else return -99;
}
int g(bool b)
{
if ( b ) return 99; //if(bool)
else return -99;
}
int main(){}
g++ intbool.cpp -S为每个函数生成asm代码如下:
-
f(int)的 asm 代码__Z1fi: LFB0: pushl %ebp LCFI0: movl %esp, %ebp LCFI1: cmpl $0, 8(%ebp) je L2 movl $99, %eax jmp L3 L2: movl $-99, %eax L3: leave LCFI2: ret -
g(bool)的 asm 代码__Z1gb: LFB1: pushl %ebp LCFI3: movl %esp, %ebp LCFI4: subl $4, %esp LCFI5: movl 8(%ebp), %eax movb %al, -4(%ebp) cmpb $0, -4(%ebp) je L5 movl $99, %eax jmp L6 L5: movl $-99, %eax L6: leave LCFI6: ret
令人惊讶的是,g(bool) 生成了更多 asm 指令!这是否意味着if(bool) 比if(int) 慢一点?我以前认为bool 是专门设计用于if 等条件语句的,所以我期望g(bool) 生成更少的asm 指令,从而使g(bool) 更高效、更快。
编辑:
到目前为止,我没有使用任何优化标志。但即使没有它,为什么它会为g(bool) 生成更多 asm 是我正在寻找合理答案的问题。我还应该告诉你,-O2 优化标志生成完全相同的 asm。但这不是问题。问题就是我问的。
【问题讨论】:
-
这也是一个不公平的测试,除非您将它们与启用的合理优化进行比较。
-
@Daniel:我没有使用任何优化标志。但即使没有它,为什么它会为
g(bool)生成更多的 asm 是我正在寻找合理答案的问题。 -
你为什么要费心去阅读汇编,而不是仅仅运行程序和计时结果?指令的数量并没有真正说明性能。您不仅需要考虑指令长度,还需要考虑依赖关系和指令类型(其中一些是使用较慢的微码路径解码的,它们需要哪些执行单元,指令的延迟和吞吐量是多少,是分支?内存访问?
-
@user 未知,@Malvolio:很明显;我不是为生产代码做所有这些。正如我在文章开头已经提到的那样,“所以出于好奇,我编写了这个程序”。所以是的,它纯属假设。
-
这是一个合理的问题。它们要么相等,要么更快。 ASM 的发布可能是为了提供帮助或大声思考,因此与其将其用作回避问题并说“只需编写可读代码”的方式,不如直接回答问题或 STFU,如果您不知道或没什么好说的;)我的贡献是这个问题是可以回答的,“只写可读的代码”只不过是回避这个问题。