You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 15:03:10