【发布时间】:2015-08-04 21:07:45
【问题描述】:
我的问题是关于gcc 编译器。
通常,在循环中,我必须使用一个函数返回的值,该值在整个循环期间是恒定的。
我想知道是否最好先将这个常量返回值存储在一个变量中(让我们想象一个长循环),或者像gcc 这样的编译器是否能够执行一些优化来缓存常量值,因为它会将其识别为不断抛出循环。
例如,当我遍历字符串中的字符时,我经常会这样写:
bool find_something(string s, char something)
{
size_t sz = s.size();
for (size_t i = 0; i != sz; i++)
if (s[i] == something) return true;
return false;
}
但是通过一个聪明的编译器,我可以使用以下(更短更清晰):
bool find_something(string s, char something)
{
for (size_t i = 0; i != s.size(); i++)
if (s[i] == something) return true;
return false;
}
然后编译器可以检测到循环内的代码没有对string对象执行任何更改,然后将构建一个代码来缓存s.size()返回的值,而不是制作一个(较慢) 每次迭代的函数调用。
gcc有这样的优化吗?
【问题讨论】:
-
这通常写成
for (size_t i = 0, m = s.size(); i!=m; ++i)。 -
@Dan,不是真的重复:最好的答案是:“内存引用和函数调用可能更困难。[关于优化]”。但我想更具体地了解
gcc -
标准库容器的
size成员函数无论如何都会被内联,所以你担心的函数调用一开始就不存在。 -
@DavidSchwartz:我会使用 for range:
for (char c : s) {if (c == something) return true; } return false;)};-)(所以循环内外没有常数)。
标签: c++ gcc optimization