gcc针对部分代码取消编译优化

为了应对编译优化可能导致的问题,如增加代码大小或影响执行,文章讲述了如何在遇到特定情况时,如在func1函数中,避免将变量放入data段而使用栈空间。通过设置-GCC push_options来取消该函数的编译优化,防止memcpy函数不必要的使用,以保持代码正确执行和优化目标的一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了提高编译和运行速度,或者为了减少代码段大小,我们常常需要使用编译优化。
默认是-O0, 我们可以修改为-O1, -O2,-Os,-O3等。
但是编译优化有时候并不一定优化到最佳的效果,或者优化的结果需要某些支持才能正确执行。
我曾经碰到过一个现象:
在函数func1()内部定义一个数组:

void func1()
{
    uint8_t slot_table[2][8] = {{04152637}{81291310141115}};
    ......
    uint8_t slot_addr = slot_table[channel][index];
    ......
}

slot table没有使用const修饰,就是希望它使用栈空间。
但是编译优化的结果是,把数组的值放在了data段,然后在使用slot_table之前调用memcpy函数进行数组的拷贝。这样不仅增加了代码段的大小(因为增加了memcpy函数的定义),而且在我们的系统中也不能得到正确的值(data段没有使用)。

因此,针对func1函数,取消编译优化:

#pragma GCC push_options
#pragma GCC optimize("O0")
void func1()
{
    uint8_t slot_table[2][8] = {{04152637}{81291310141115}};
    ......
    uint8_t slot_addr = slot_table[channel][index];
    ......
}
#pragma GCC pop_options

注意,pragma GCC push_options等字段需要放在函数外部,不能放在函数内部使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值