可以在编译时执行具有常量参数的 C 标准库函数吗?
Can C standard library functions with constant argument(s) be executed at compile time?
可以如下代码:
float f = sinf(0.5f);
优化为如下代码(其实是伪代码给个思路):
float f = 0x1.eaee88p-2f;
feraiseexcept(FE_INEXACT);
其他C标准库函数同理。据我所知,由于“整个语言是基于”抽象机器“()的(相当无用的)概念,因此“实现可以自由地以优化方式做任何事情,只要侧效果和“可观察到的行为”受到尊重”(相同link)。
一些编译器会将其优化为简单的常量表达式。这是因为编译器知道标准库中的函数是如何工作的。编译器知道 sinf
没有副作用。
int main(void)
{
float f = sinf(0.5f);
printf("%f\n", f);
}
.LC1:
.string "%f\n"
main:
sub rsp, 8
mov edi, OFFSET FLAT:.LC1
mov eax, 1
movsd xmm0, QWORD PTR .LC0[rip]
call printf
xor eax, eax
add rsp, 8
ret
.LC0:
.long -2147483648
.long 1071558376
可以如下代码:
float f = sinf(0.5f);
优化为如下代码(其实是伪代码给个思路):
float f = 0x1.eaee88p-2f;
feraiseexcept(FE_INEXACT);
其他C标准库函数同理。据我所知,由于“整个语言是基于”抽象机器“(
一些编译器会将其优化为简单的常量表达式。这是因为编译器知道标准库中的函数是如何工作的。编译器知道 sinf
没有副作用。
int main(void)
{
float f = sinf(0.5f);
printf("%f\n", f);
}
.LC1:
.string "%f\n"
main:
sub rsp, 8
mov edi, OFFSET FLAT:.LC1
mov eax, 1
movsd xmm0, QWORD PTR .LC0[rip]
call printf
xor eax, eax
add rsp, 8
ret
.LC0:
.long -2147483648
.long 1071558376