【发布时间】:2021-06-18 05:49:44
【问题描述】:
我正在玩编译器资源管理器,试图了解更多关于 ARM-Assembly 的知识。我使用 arm64 msvc v19.latest。我注意到我少了一个这样的分支:
int main(){
for(unsigned i = 0; i<8;)
i++;
return 0;
}
与编写这样的 for 循环的“常规”方式相比:
int main(){
for(unsigned i = 0; i<8;i++)
;
return 0;
}
因此以非常规的方式编写 for 循环是否更有效?我将粘贴两个asm进行比较。先用非常规的方法:
;Flags[SingleProEpi] functionLength[52] RegF[0] RegI[0] H[0] frameChainReturn[UnChained] frameSize[16]
|main| PROC
|$LN6|
sub sp,sp,#0x10
mov w8,#0
str w8,[sp]
|$LN2@main|
ldr w8,[sp]
cmp w8,#8
bhs |$LN3@main|
ldr w8,[sp]
add w8,w8,#1
str w8,[sp]
b |$LN2@main|
|$LN3@main|
mov w0,#0
add sp,sp,#0x10
ret
ENDP ; |main|
和传统的方式:
;Flags[SingleProEpi] functionLength[56] RegF[0] RegI[0] H[0] frameChainReturn[UnChained] frameSize[16]
|main| PROC
|$LN6|
sub sp,sp,#0x10
mov w8,#0
str w8,[sp]
b |$LN4@main|
|$LN2@main|
ldr w8,[sp]
add w8,w8,#1
str w8,[sp]
|$LN4@main|
ldr w8,[sp]
cmp w8,#8
bhs |$LN3@main|
b |$LN2@main|
|$LN3@main|
mov w0,#0
add sp,sp,#0x10
ret
ENDP ; |main|
【问题讨论】:
-
开启优化会更加提升性能。
-
你编译这个没有优化吗?结果非常糟糕且不确定。
-
是的,您的代码没有副作用,因此好的编译器应该全部替换为
return 0 -
启用优化时会删除整个循环。
for(unsigned i=0; i<8; ) { printf("%d\n", i); i++; }和“标准”版本都会产生相同的展开循环并启用优化。 -
Re "在这个例子中打开优化有点失败,",不,你没有抓住重点:比较没有意义两个未优化的程序集的优化程度。