gcc const和函数调用之间的优化

时间:2016-02-13 21:50:15

标签: c gcc

考虑使用gcc-Ofast编译的代码:

int f1(const char *p) {
    if (!p[0])
        return 0;

    f2(); //not inlined

    if (p[0]) { //not optimized out
        //do something
        return 0;
    } else {
        //do something else
        //not optimized out
        return 1;
    }
}

我如何获得第二个测试和下部分支被优化的行为(因为p[0]const并且已经过测试)?

2 个答案:

答案 0 :(得分:2)

编译器没有理由认为函数f2可能无法修改p指向的内容。 p定义为const char *p的事实只告诉编译器p不能用于修改它指向的数据,而不是数据本身是常量。

如果你知道数组确实没有被函数f2()修改,你可以修改代码再不读它,看看gcc是否会相应地进行优化:

int f1(const char *p) {
    char c = *p;
    if (!c)
        return 0;

    f2(); //not inlined

    if (c) { //should be always true
        //do something
        return 0;
    } else {
        //should be optimized out
        //do something else
        return 1;
    }
}

答案 1 :(得分:2)

你有没有拆解构建以确保它是?尝试使用 restrict 关键字和const来确保编译器知道没有其他任何内容可以更改它;你正在调用另一个函数 f2(),编译器无法知道是否有另一个指针指向f2中使用的同一块内存。但只有在此分支中没有任何内容修改同一块内存时才会这样做。

如果if(!p[0])已初始化为p,则NULL似乎很危险BTW - 没有任何可以取消引用的内容。