Ste*_*mer 5 c++ gcc compiler-optimization
如果我有一些数学方程依赖于可以为零或非零的输入(模板参数,在编译时已知),优化器是否会评估方程并优化其知道将评估为0或1的表达式.
例如:
double x = y * Eval<type>::value;
Run Code Online (Sandbox Code Playgroud)
如果Eval<type>::value是0,x将永远0.
double x = exp(y * Eval<type>::value);
Run Code Online (Sandbox Code Playgroud)
如果Eval<type>::value是0,x将永远1.
优化器身影了这一点,可取代x用0或1其他地方的代码,或将这些计算在运行时进行?
我正在使用gcc 4.7 -O3
小智 1
编辑:我错了,编译器在使用浮点数时按预期工作。
好吧,gcc 4.6.3 似乎-O3确实做到了这一点,只要表达式是整数相关的。
示例代码:
#include <cstdio>
inline int x(double y)
{
if (y == 0)
printf("Hello bob3\n");
else
printf("Why do I bother\n");
};
const int c = 0;
int main()
{
int f;
scanf("%d",&f);
x(f * c);
}
Run Code Online (Sandbox Code Playgroud)
组装结果
.file "foo.cpp"
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "%d"
.LC1:
.string "Hello bob3"
.section .text.startup,"ax",@progbits
.p2align 4,,15
.globl main
.type main, @function
main:
.LFB13:
.cfi_startproc
subq $24, %rsp
.cfi_def_cfa_offset 32
movl $.LC0, %edi
xorl %eax, %eax
leaq 12(%rsp), %rsi
call scanf
movl $.LC1, %edi
call puts
xorl %eax, %eax
addq $24, %rsp
.cfi_def_cfa_offset 8
ret
.cfi_endproc
.LFE13:
.size main, .-main
.ident "GCC: (Debian 4.6.3-1) 4.6.3"
.section .note.GNU-stack,"",@progbits
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
205 次 |
| 最近记录: |