我想比较 GCC 内置函数 memcpy
和 libc 中的函数。但是,-fno-builtin
或 -fno-builtin-memcpy
的所有迭代似乎都被忽略了。
//g++ -O3 foo.cpp -S or
//g++ -O3 -fno-builtin foo.cpp -S
#include <string.h>
int main() {
volatile int n = 1000;
//int n = 1000;
float *x = new float[1000];
float *y = new float[1000];
memcpy(y,x,sizeof(float)*n);
//__builtin_memcpy(y,x,sizeof(float)*n);
}
我发现,如果上面源代码中的 n
不是可变的,那么它会内联内置代码。但是,当 n
变为 volatile 时,它会调用函数 __memcpy_chk
,它是 memcpy with buffer overflow checking 的一个版本。 .如果 n
是易变的,我改为调用 __builtin_memcpy
,那么它会调用 memcpy
。
到目前为止,我的结论是,只有在编译时知道 n
时才会生成内置代码,而 -fno-builtin
是无用的。我正在使用 GCC 4.8.2。
-fno-builtin
过时了吗?有没有办法让 GCC 从 C 库调用 memcpy
,即使 n
在编译时已知?
最佳答案
-fno-builtin
和 -fno-builtin-memcpy
都具有您预期的 gcc 4.9.1 效果。这可能只是 gcc 4.8.2 中的一个错误;这种特殊的选项组合并未得到广泛使用。 -ffreestanding
是一个相关的开关,在 4.8.2 中可能会产生您想要的效果。
请注意,编译器有权将您的程序优化到
int main() { return 0; }
在没有 -fno-builtin(-memcpy)
或 -ffreestanding
的情况下调用时,即使 n
是 volatile
,因为它可以(原则上)证明整个程序没有可观察到的副作用,或者它的行为是未定义的。 (当 n
不是 volatile
时,不存在 UB;如果 n
超出范围 [0, 1000]
读取时,volatile
告诉编译器它不能假定 n
具有程序写入的值。)
关于c++ - 带有 -fno-builtin 的 GCC 似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25272576/