小编jgu*_*son的帖子

强制/说服/欺骗GCC展开_Longer_循环?

我如何说服GCC展开一个已知迭代次数但又很大的循环?

我正在编译-O3.

当然,有问题的真实代码更复杂,但这是一个具有相同行为的简化示例:

int const constants[] = { 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144 };

int get_sum_1()
{
    int total = 0;
    for (int i = 0; i < CONSTANT_COUNT; ++i)
    {
        total += constants[i];
    }
    return total;
}
Run Code Online (Sandbox Code Playgroud)

...如果CONSTANT_COUNT被定义为8(或更少),那么GCC将展开循环,传播常量,并将整个函数简化为简单return <value>;.另一方面,如果CONSTANT_COUNT是9(或更高),那么循环不会展开,并且GCC会生成一个二进制循环,读取常量,并在运行时添加它们 - 即使理论上,该函数仍然可以被优化到只返回一个常数.(是的,我看过反编译的二进制文件.)

如果我手动展开循环,如下所示:

int get_sum_2()
{
    int total = 0;
    total += constants[0];
    total += constants[1];
    total += constants[2];
    total += constants[3];
    total …
Run Code Online (Sandbox Code Playgroud)

c gcc loop-unrolling

9
推荐指数
1
解决办法
563
查看次数

标签 统计

c ×1

gcc ×1

loop-unrolling ×1