我是靠谱客的博主 缥缈香烟,最近开发中收集的这篇文章主要介绍gcc针对部分代码取消编译优化,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

为了提高编译和运行速度,或者为了减少代码段大小,我们常常需要使用编译优化。
默认是-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等字段需要放在函数外部,不能放在函数内部使用。

最后

以上就是缥缈香烟为你收集整理的gcc针对部分代码取消编译优化的全部内容,希望文章能够帮你解决gcc针对部分代码取消编译优化所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部