我知道如果while循环有这个主体:
while(a<b){
do_some_calculations
}
它会进行计算,然后再次检查while循环。但是如果我有一个空的while
循环:
while(a<b) { }
检查条件的频率是多少?我知道while循环编译为cmp
和jmp
指令(需要一到两个循环)。所以它会检查while循环每1-2个循环?或者不是,有些东西我不知道?细节解释将非常有帮助。
P.S。问题是关于低级细节。请仔细阅读。我想知道共同的原则,而不是“它依赖于编译器等等”。
P.P.S让我们假设我们有一些有效的条件和编译器为它生成的代码。它会检查它吗?这就是问题。
答案 0 :(得分:4)
由于标准允许在生成的程序集中提供许多解决方案,因此您的问题实际上归结为“编译器做了什么?”因此只能通过例子来回答。
我使用GCC 4.2.1(基于Apple Inc. build 5658)执行了以下测试(LLVM build 2336.11.00):
main.cpp中:
int main() {
while (true) { }
}
我使用以下命令行编译它:
g++ -S main.cpp
输出的简化版本main.S看起来像这样:
LBB1_1:
jmp LBB1_1
因此,使用 no 优化,编译器会识别出没有要检查的条件,因此它只会生成一个紧密的循环。
我怀疑其他编译器会做同样的事情,至少如果启用了任何优化。唯一可以确定的方法是检查:)
答案 1 :(得分:4)
你似乎没有问正确的问题。如果问题涉及产生汇编代码的语言,那么答案将取决于编译器,优化级别和某些其他事情,但最重要的是,它将取决于 条件 即可。每个循环将进行一次测试。如果该测试包括进入数据库并在那里检查某些内容,则执行循环的频率远低于在某个到期时间内检查本地时间的情况(例如)。如果不进一步了解 条件 ,则无法得出一般答案。当然,根据条件,编译器有时可以优化测试,但前提是代码的可见行为不依赖于它。因此,从概念上讲,仍然会在每次迭代时检查条件。当然,直到条件产生错误并且循环结束。
答案 2 :(得分:2)
你的代码会创建一个紧密循环,但如果它是空的,它将只是一个无限循环,如(;;)
- 没有终止条件的循环,它将占用所有处理器资源或100%/ number_of_cores如果它是多核的。在旧的操作系统中,这样的代码能够使整个系统“冻结”,但现在所有OS的调度程序都是抢占式的,因此它只执行一个时间量程(从1到200毫秒,取决于操作系统)和内部如果主体是空的并且编译器因为优化而没有移除你的条件,那么这个量子将在没有中断的情况下每2-5个周期执行一次。所以我认为,正如我看到许多人认为的那样,你的问题是模糊不清的。
答案 3 :(得分:1)
它将生成行为的代码,就像每次迭代检查条件一样。
如果编译器可以证明在每次迭代时检查条件是不必要的,那么它可以删除检查。但这取决于单个编译器,并取决于您提供的精确代码。
答案 4 :(得分:1)
在while
循环中,将在输入之前检查条件
循环,因此将再次检查它的数量
你经历循环的时候。
至少在抽象机器上。允许编译器
优化。因此,在您的示例中,如果编译器可以知道
a
和b
的值(因为例如它们已被分配
紧接着之前的常量),然后它可能不生成代码
做检查。如果循环显然不包含任何东西
这可以改变条件,它可能不会产生任何检查
第一次检查后,由于结果无法改变。唯一的
编译器的实际限制是可观察的输出
与进行比较的情况相同。 (我觉得
编译器也允许假设循环终止
有时候,将代码移到它上面的循环之下,等等
那个。)
答案 5 :(得分:0)
让我们假设我们有一些有效的条件和编译器为它生成的代码.HOW OFTEN它会检查它吗?这就是问题。
如果没有优化,在每个循环中,永远不会有优化,编译器会理解你的条件不会改变。
答案 6 :(得分:0)
编译器如何转换它与C或C ++无关,只要它有效。如果编译器可以看到你的循环根本不需要运行,它就可以删除它。它可以展开循环并完全删除除第一个检查之外的所有内容。这一切都取决于编译器和代码,并没有单一的答案。
如果编译器根本不进行优化,它将按照标准要求进行 - 在每次迭代开始时进行一次检查。