2013年10月20日 星期日

char * 與 char [] 的差異

當我們宣告:
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 同學的引述.

沒有留言:

張貼留言