December 17, 2005

C-style 字串的最佳化

C-style 字串的最佳化有許多途徑,Timo Sirainen 撰寫的 [Secure, Efficient and Easy C programming] 是相當值得一看的文章,在實務應用上,不僅要避免 string operation 引來的 buffer overflow 外,又得避免大量的小段記憶體配置片段,這會造成 memory leaking,再來,針對特定的應用場合,如 heavy traffic networking 的環境,勢必需要發展一系列的機制來克服以上的議題。[Vstr] 這個最佳化的字串處理函式實做,有許多相當值得一看的資訊,如 [String library comparison] 比較了許多開放的實做,並且在 [Speed comparison of Vstr vs. other string APIs] 提及其比較的方法與參考實做,然而,選對 library,就意味著解決問題了?當然不是。

「最佳化」是個複雜的議題,但是這裡不打算提 global optimization,而在 gtk-devel mailing-list 上,Daniel Marjamäki 提出一個想法: [RFC: String cleanup],敘及原本的:
    const char *str
更換成:
    const char str[]
可產生比較直覺的機械碼,可提昇 CPU 效能與記憶體使用。這引來 iolo 的進一步思考: [Isn't C wonderful?],他舉出以下的程式碼片段:
    static const char *str1 = "azerty";
    static const char str2[] = "azerty";
    void f(const char *x);
    void try(void) {
            f(str1);
            f(str2);
    }
    
透過 GCC 產生組譯碼:
    gcc -O3 -S const_char.c
我將輸出用 OpenOffice Impress 做了對應比較:

在組譯碼可以發現,C compiler 對於 const char [] 會生成直接的輸出,並且字串的操作也較直覺,相對的,const char * 在語意上是 pointer,而 C compiler 則予以 indirect access,這需要留意。
由 jserv 發表於 December 17, 2005 11:40 PM
迴響