使用-fno-builtin的GCC似乎不起作用

Z b*_*son 7 c++ gcc memcpy

我想比较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);    
}
Run Code Online (Sandbox Code Playgroud)

我发现如果n在上面的源代码中不是volatile,那么它会内置代码.但是,当n它变为volatile时,它会调用函数__memcpy_chk,该函数是具有缓冲区溢出检查memcpy版本.如果n是不稳定的,我会调用__builtin_memcpy然后调用memcpy.

所以到目前为止我的结论是内置代码只有n在编译时才知道并且-fno-builtin没用.我正在使用GCC 4.8.2.

-fno-builtin过时了吗?有没有办法memcpy从C库调用GCC ,即使n在编译时已知?

zwo*_*wol 4

-fno-builtin两者-fno-builtin-memcpy都具有 gcc 4.9.1 所期望的效果。这可能只是 gcc 4.8.2 中的一个错误;这种特殊的选项组合并未得到广泛使用。-ffreestanding是一个相关的开关,可能会在 4.8.2 中达到您想要的效果。

请注意,编译器有权将您的程序优化到

int main() { return 0; }
Run Code Online (Sandbox Code Playgroud)

当不使用-fno-builtin(-memcpy)or调用时-ffreestanding,即使是nis时volatile,因为它可以(原则上)证明整个程序没有可观察到的副作用,或者其行为是未定义的。(当nis not volatile时,不能有 UB;如果读取时n超出范围,则发生 UB,并告诉编译器不能假设程序写入了值。)[0, 1000]volatilen