从Go汇编角度解读for循环的问题

qqutterly47306 20 0 pdf 2021-06-20 21:06:23

上面这段代码里,遍历前后arr有哪些变化?00106行:XORL AX AX是初始化AX寄存器,AX寄存器里包含当前循环位置。00108行:JMP 162表示跳转到00162行。00110到00120行是循环体代码的前半部分。在读这段代码的汇编时,发现编译器针对数组内容做了一个小优化,当数组长度小于5时候,编译器会认为这个数组只是临时变量,会直接做栈上赋值,直接将数组内容放到autotmp_2变量中(栈上),省略了从数据只读区到AX的过程,数组长度小于5时,汇编代码如下:分析到这里,我们可以得到一段表示for循环的伪代码:由此我们可以得到结论:for-range时拷贝了被访问的列表。问题2所带的思考:当数组比较大时,for-range拷贝数组的开销也会比较大,在实际应用中应当避免这个开销。

从Go汇编角度解读for循环的问题

从Go汇编角度解读for循环的问题

从Go汇编角度解读for循环的问题

用户评论
请输入评论内容
评分:
暂无评论