【发布时间】:2012-07-07 01:55:07
【问题描述】:
我不确定下面的代码是否会导致冗余计算,还是编译器特有的?
for (int i = 0; i < strlen(ss); ++i)
{
// blabla
}
strlen() 每增加一次strlen() 都会计算吗?
【问题讨论】:
-
我猜如果没有复杂的优化可以检测到'ss'在循环中永远不会改变,那么是的。最好编译一下,看看汇编看看。
-
这取决于编译器、优化级别以及您(可能)在循环内对
ss执行的操作。 -
如果编译器可以证明
ss从未被修改过,它可以将计算提升到循环之外。 -
@Mike:“需要在编译时分析 strlen 到底做了什么” - strlen 可能是一个内在函数,在这种情况下优化器知道它做了什么。
-
@MikeSeymour:没有可能,可能没有。 strlen 是由 C 语言标准定义的,它的名称是为该语言定义的用途而保留的,因此程序不能随意提供不同的定义。编译器和优化器有权假定 strlen 仅依赖于其输入并且不修改它或任何全局状态。这里优化的挑战是确定 ss 指向的内存不会被循环内的任何代码更改。这对于当前的编译器来说是完全可行的,具体取决于具体的代码。
标签: c++ c gcc optimization strlen