【发布时间】:2014-08-12 19:30:55
【问题描述】:
我想比较一下 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 变为易失性时,它会调用函数__memcpy_chk,它是memcpy with buffer overflow checking 的一个版本。如果n 是不稳定的,我改为调用__builtin_memcpy,那么它调用memcpy。
所以到目前为止,我的结论是,只有在编译时知道n 并且-fno-builtin 无用时才会生成内置代码。我正在使用 GCC 4.8.2。
-fno-builtin 过时了吗?即使在编译时知道n,有没有办法让GCC从C库调用memcpy?
【问题讨论】:
-
我刚刚注意到,在这个问题和您的 cmets 中,您拼错了
-fno-builtin几种不同的方式。检查以确保这不会影响您的结果。正确的拼写是“b u i l t i n”。 -
@Zack,感谢您找到拼写错误。我希望我把它们都修好了。我确实有点太草率了(当我应该在我的测试示例中使用 malloc 时,我也使用了
new- 在我自己的代码中,无论如何我都在使用_mm_malloc)。但是如果我使用任何拼写错误,GCC 会抱怨。但是,如果您想自己检查,请将上面的代码(删除 volatile)放入 gcc.godbolt.org 并更改为 GCC 4.8 或 4.9,添加-fno-builtin并查看汇编代码。 -
@Zack,确保你也添加了
-O3。