首页 > 解决方案 > 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 文档并不完全同步。

标签: gccfreestanding

解决方案


推荐阅读