我定义了函数
double builtin_test(double y)
{
double x = __builtin_sin(y);
return x;
}
认为它应该有用,但是在编译时
C:\ DOCUME~1 \ ADMINI~1 \ USTAWI~1 \ Temp \ ccNuVeYz.o:test6.c :(。text + 0x5):undefined ref 对'罪'的理解
如何让它发挥作用?
答案 0 :(得分:2)
这不是一个真正的答案(但是,问题也不是很清楚) - 评论时间太长了,而且我不想连续发表2-3条评论。 。
重要的是要理解__builtin_*
函数的主要原因是支持编译器知道如何操作的东西 - 有时,这变成简单地调用相关的标准库函数,而不是实际做任何事情特别。
如果我们以sin
为例,在x87中,可以生成fsin
指令。但是如果编译器只看到一堆数学,它就不会知道代码是sin
,所以不会产生fsin
指令,只需做一堆乘法,减去,添加等来执行该计算。因此,在标准库或标头中使用__builtin_sin
,例如:
double sin(double x)
{
return __builtin_sin(x);
}
将生成fsin
指令。
我在我的机器上用gcc和clang进行了一些实验,我无法说服编译器在运行时实际计算sin而不调用sin
函数。代码的clang版本决定将我的整个循环值sin
值计算为常量 - 这当然是对100次计算的好胜利,但不完全是我们正在寻找的。
请注意,fsin
指令非常慢,并且使用简单指令执行单独的计算步骤可能同样快 - 但我们不希望每次sin
都是内联的使用过(当然不希望编译器"知道"如何做到这一点。)