gcc - gcc:具有更高优化的独立选项导致更大的代码
问题描述
当使用更高的优化标志(例如:-O3)进行编译时,gcc 将像这样汇编代码:
extern unsigned char g_wibble[200];
int test(void)
{
int i;
for (i = 0; i < sizeof(g_wibble); i++)
g_wibble[i] = 0;
return 0;
}
以使用 memset() 而不是本地循环的方式。这与添加-ffreestanding
标志有关。如this answer中所述,gcc 不能依赖任何语义考虑,因此它不能假设 memset 在此环境中具有与通常相同的含义(这似乎与文档中说 gcc 期望在提供 memset 之类的函数一个独立的环境。结果是 gcc 有点发疯了,并且似乎将其 memset 的整个内部视图内联到代码中。
使用 godbolt.org 并使用 arm gcc 7.2.1 (none) 和 compiler flags 进行测试-O2 -mthumb -mcpu=cortex-m0plus -ffreestanding
,我得到 14 行输出。更改为 -O3 会创建 62 行输出,这是一种效率相当低的方法。
在考虑独立环境时,值得仔细考虑您的优化选项!请记住,-O3 确实意味着“优化更多”,但无论代码大小或编译时间影响如何,都针对性能进行了更多优化。
是的,这是一个陈述而不是一个问题;但是我可以问这是预期的 gcc 行为还是可能是优化错误?该行为与 gcc 文档并不完全同步。
解决方案
推荐阅读
- laravel - 在路由上调用正确的控制器
- google-cloud-platform - 将 Caffe 添加到 Datalab 实例
- java - Android Java - 广播接收器 - 应用通知
- javascript - Images load into one
- java - 客户端如何知道服务器何时等待 Java 中的数据?
- html - 如何让引导程序将这个渲染的 django 模板居中?
- excel - VBA Help Solve 用于根据条件复制、过滤、粘贴到行中的代码
- javascript - 'this' 在类方法中未定义
- r - 使用 lubridate 从出生日期和当前日期计算年龄得到负年龄
- python - OpenCV:无法创建“Shape”类型的图层“flatten_1/Shape”