考虑使用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
并且已经过测试)?
答案 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 - 没有任何可以取消引用的内容。