gpt4 book ai didi

c - 常量表达式的数学函数是否在编译时预先计算?

转载 作者:太空狗 更新时间:2023-10-29 16:39:27 30 4
gpt4 key购买 nike

为了方便和连贯,我倾向于使用常量表达式的数学函数(即 log(x)/log(2) 而不是 log(x)/0.3...)。由于这些函数实际上并不是语言本身的一部分,它们也没有在 math.h 中定义(仅声明),常量函数会在编译时预先计算,还是会被浪费地计算在运行时?

最佳答案

这取决于编译器和优化标志。正如@AndrewyT 指出的那样,GCC 能够通过属性指定哪些函数是常量和纯函数,在这种情况下答案是肯定的,它将内联结果,您可以轻松检查:

$ cat constant_call_opt.c 
#include <math.h>

float foo() {
return log(2);
}

$ gcc -c constant_call_opt.c -S

$ cat constant_call_opt.s
.file "constant_call_opt.c"
.text
.globl foo
.type foo, @function
foo:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl $0x3f317218, %eax
movl %eax, -4(%ebp)
flds -4(%ebp)
leave
ret
.size foo, .-foo
.ident "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3"
.section .note.GNU-stack,"",@progbits

那里没有函数调用,只是加载一个常量(0x3f317218 == 0.69314718246459961 == log(2))

虽然我现在手头没有任何其他编译器可以尝试,但我认为您可以期望所有主要的 C 编译器都有相同的行为,因为这是一个微不足道的优化。

关于c - 常量表达式的数学函数是否在编译时预先计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2049412/

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