c++ - 带有 -fno-builtin 的 GCC 似乎不起作用

标签 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);    
}

我发现,如果上面源代码中的 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 的情况下调用时,即使 nvolatile,因为它可以(原则上)证明整个程序没有可观察到的副作用,或者它的行为是未定义的。 (当 n 不是 volatile 时,不存在 UB;如果 n 超出范围 [0, 1000] 读取时,volatile 告诉编译器它不能假定 n 具有程序写入的值。)

关于c++ - 带有 -fno-builtin 的 GCC 似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25272576/

相关文章:

java - java中的包含和排除原理

c++ - C++中是否有任何内置方法来找出数组的长度?

c++ - CComVariant 与 _variant_t、CComBSTR 与 _bstr_t

无法使预编译头与arm-none-eabi-gcc一起工作

c++ - 为什么包含 <map> 会导致在全局命名空间中定义 div 函数?

IOS memcpy 纹理到双数组

c++ - OpenMP C++ 矩阵乘法

c - 如何截获正在写入内存段的指令的地址?

C : Insert/get element in/from void array

c++ - memcpy CString 到 char*