如何在gcc的-Os编译选项下强制调用memcpy而非内联
保留-Os编译选项时强制GCC调用memcpy的局部实现方法
在使用-Os编译时,GCC默认会将memcpy内联为x86-64架构的rep movsb指令。要保留-Os的同时让GCC生成对memcpy的直接调用,且实现比全局-fno-builtin-memcpy更局部的控制,可采用以下两种C文件内的实现方式:
方法一:使用函数指针绑定memcpy
通过定义一个指向memcpy的常量函数指针,让编译器无法识别出这是内置memcpy的调用,从而强制生成外部函数调用:
#include <string.h> // 定义常量函数指针,指向标准memcpy void *(*const my_memcpy)(void *, const void *, size_t) = memcpy; void copy_data(void *dst, const void *src, size_t len) { my_memcpy(dst, src, len); // 此处会生成直接调用memcpy的指令 }
这种方式仅影响使用该函数指针的代码段,其他函数的memcpy仍可被内联优化。
方法二:用函数属性局部禁用memcpy内置优化
通过__attribute__((no_builtin(memcpy)))修饰特定函数,仅在该函数范围内禁用memcpy的内置优化,强制编译器生成直接调用:
#include <string.h> // 仅当前函数禁用memcpy的内置优化 __attribute__((no_builtin(memcpy))) void copy_data(void *dst, const void *src, size_t len) { memcpy(dst, src, len); // 此处会生成call memcpy的指令 }
该方法精准控制单个函数的行为,不会影响其他函数的memcpy内联优化,比全局编译选项更灵活。
注意:volatile指针的局限性
用volatile指针调用memcpy无法生成直接调用的原因是,编译器仍可能对volatile指针的调用做特殊处理,无法确保生成标准的call memcpy指令,因此不推荐使用。
内容的提问来源于stack exchange,提问作者Petr Skocik
相关产品推荐
相关产品推荐

