现在我已经习惯了在内存限制条件下进行编程,我没有答案的一个问题是:哪个内存效率更高; - (;;)还是while()?或者它们是否可以互换?如果有的话,还要评论效率问题!
答案 0 :(得分:6)
编程语言构造for
和while
之间的内存使用没有区别。给定的编译器可能会更好地优化其中一个,但您不必担心这一点。对于内存约束条件,最重要的是您的数据结构和系统设计。糟糕的系统设计可能需要更多内存。
答案 1 :(得分:3)
唯一可以确定的方法是使用 编译器为 平台进行测试。但我认为任何足够先进的优化C编译器都会在大多数情况下优化它们。
答案 2 :(得分:2)
for(init;cond;inc){
//...
}
(几乎)与
完全相同init;
while(cond){
//...
inc;
}
不同之处在于for continue;
也会执行inc;
,但您必须在此时手动执行此操作
并且init;
语句中声明的变量被约束为for(它引入了一个新范围)但是在while中不是这种情况
这使得for循环在几种情况下更容易使用(例如,对数组进行迭代)但是编译后的代码可能是相同的,因此选择一个而不是另一个的唯一原因是可读性
注意我说的主要是关于java我不知道c中的具体细节,以便对此发表评论
答案 3 :(得分:0)
嗯,这取决于编译器...但想到这样:
while(x){
x++;
}
使用您在循环范围之外声明的变量,这意味着您正在使用已为循环创建的数据。
for循环只为循环内部的循环初始化变量。
for(int x = 0; x > y; x++{
}
因此,如果你有一个变量只是坐在那里有一个你可以使用的值,那么while循环很可能(取决于编译器)对这种情况更好。但是如果你需要为循环创建变量,我会使用for循环。
希望这会有所帮助。
答案 4 :(得分:0)
我在使用时钟的c程序中做了一些测试,结果没有结果..所以我写了代码
for(int i=0;i< 100000000; i++){
g+=2;
}
和代码
int i2 = 0;
while(i2 < 100000000){
g+=2;
i2++;
}
使用gcc在dev c ++中编译时,程序集分解为完全相同的字节码......
CPU Disasm;
Address Hex dump Command Comments
0040160C |. C745 E0 00000 MOV DWORD PTR SS:[LOCAL.8],0
00401613 |> 817D E0 FFE0F /CMP DWORD PTR SS:[LOCAL.8],5F5E0FF
0040161A |. 7F 0D |JG SHORT 00401629
0040161C |. 8D45 E4 |LEA EAX,[LOCAL.7]
0040161F |. 8300 02 |ADD DWORD PTR DS:[EAX],2
00401622 |. 8D45 E0 |LEA EAX,[LOCAL.8]
00401625 |. FF00 |INC DWORD PTR DS:[EAX]
00401627 |.^ EB EA \JMP SHORT 00401613
这两组代码都会反汇编到那个精确的程序集中,因此你可以看到它们同样一样好。再加上时钟测试总是以一次更快的速度返回,另一次更快,另一次证明它...
如果你想要有效率,你可以在反汇编程序中找到你的代码并手动优化它;)
例如,这些循环可以像这样表示
CPU Disasm
Address Hex dump Command Comments
00401492 |. 60 PUSHAD
00401493 |. 31DB XOR EBX,EBX
00401495 |. 31C0 XOR EAX,EAX
00401497 |> 81FB FFE0F505 /CMP EBX,5F5E0FF
0040149D |. 7F 05 |JG SHORT 004014A4
0040149F |. 40 |INC EAX
004014A0 |. 40 |INC EAX
004014A1 |. 43 |INC EBX
004014A2 |.^ EB F3 \JMP SHORT 00401497
004014A4 |> 8945 E4 MOV DWORD PTR SS:[LOCAL.7],EAX
004014A7 |. 61 POPAD
您可以将两个INC EAX更改为ADD EAX,但是这又使用了1个字符我不想丢失:)
这种优化的运行速度大约是原来的两倍:)