gpt4 book ai didi

c++ - 优化器会根据编译时常量推导出数学表达式吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:49:13 28 4
gpt4 key购买 nike

如果我有一些数学方程依赖于可以为零或非零的输入(模板参数,在编译时已知),优化器是否会计算方程并优化它知道将计算为 0 或 1 的表达式。

例如:

double x = y * Eval<type>::value;

如果Eval<type>::value0 , x永远是0 .

double x = exp(y * Eval<type>::value);

如果Eval<type>::value0 , x永远是1 .

优化器能否解决这个问题并替换 x01在代码的其他地方,还是这些计算会在运行时执行?

我正在使用 gcc 4.7 和 -O3

最佳答案

编辑:我错了,编译器在使用 float 时按预期工作。

好吧,-03 中的 gcc 4.6.3 似乎确实可以这样做,只要表达式与整数相关。

示例代码:

#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);
}

生成的程序集

    .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

关于c++ - 优化器会根据编译时常量推导出数学表达式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10406979/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com