當我們宣告:
char * str = "abc"; 跟 char str[] = "abc";
compiler 對這兩個宣告的處理是不一樣的.
當宣告char pointer指向一個"abc",compiler會在data segement(read-only)儲存這些字串("abc")然後把地址交給char *str(在stack上的一個地址空間);
而宣告char array,"abc"也會存在data segement裡,但為了提供修改char array,compiler會再把"abc"從data segement讀出來,存一份copy到stack segement(read-write);
就這個複製到stack segement的動作,宣告char array會需要更多的指令出完成,ex:
char str[3] = "abc";
5e60: f645 72f8 movw r2, #24568 ; 0x5ff8
5e64: f2c0 0200 movt r2, #0
5e68: f107 030c add.w r3, r7, #12
5e6c: 6812 ldr r2, [r2, #0]
5e6e: 4611 mov r1, r2
5e70: 8019 strh r1, [r3, #0]
5e72: f103 0302 add.w r3, r3, #2
5e76: ea4f 4212 mov.w r2, r2, lsr #16
5e7a: 701a strb r2, [r3, #0]
char * str= "abc";
5e60: f645 73e0 movw r3, #24544 ; 0x5fe0
5e64: f2c0 0300 movt r3, #0
5e68: 60fb str r3, [r7, #12]
若這些宣告是在一個不斷執行的while loop裡面,相較於pointer 宣告,array宣告額外的指令數就會被放大更多,影響效能.(micro-optimization issue)
以上轉貼至2013進階嵌入式實作課程之Will Fong 同學的引述.
沒有留言:
張貼留言