C++代碼優(yōu)化(3)

字號(hào):

結(jié)構(gòu)體成員的布局
    很多編譯器有“使結(jié)構(gòu)體字,雙字或四字對(duì)齊”的選項(xiàng)。但是,還是需要改善結(jié)構(gòu)體成員的對(duì)齊,有些編譯器可能分配給結(jié)構(gòu)體成員空間的順序與他們聲明的不同。但是,有些編譯器并不提供這些功能,或者效果不好。所以,要在付出最少代價(jià)的情況下實(shí)現(xiàn)的結(jié)構(gòu)體和結(jié)構(gòu)體成員對(duì)齊,建議采取這些方法:
    按類型長(zhǎng)度排序
    把結(jié)構(gòu)體的成員按照它們的類型長(zhǎng)度排序,聲明成員時(shí)把長(zhǎng)的類型放在短的前面。
    把結(jié)構(gòu)體填充成最長(zhǎng)類型長(zhǎng)度的整倍數(shù)
    把結(jié)構(gòu)體填充成最長(zhǎng)類型長(zhǎng)度的整倍數(shù)。照這樣,如果結(jié)構(gòu)體的第一個(gè)成員對(duì)齊了,所有整個(gè)結(jié)構(gòu)體自然也就對(duì)齊了。下面的例子演示了如何對(duì)結(jié)構(gòu)體成員進(jìn)行重新排序:
    不好的代碼,普通順序 推薦的代碼,新的順序并手動(dòng)填充了幾個(gè)字節(jié)
    struct
    {
    char a[5];
    long k;
    double x;
    } baz;
    struct
    {
    double x;
    long k;
    char a[5];
    char pad[7];
    } baz;
    這個(gè)規(guī)則同樣適用于類的成員的布局。
    按數(shù)據(jù)類型的長(zhǎng)度排序本地變量
    當(dāng)編譯器分配給本地變量空間時(shí),它們的順序和它們?cè)谠创a中聲明的順序一樣,和上一條規(guī)則一樣,應(yīng)該把長(zhǎng)的變量放在短的變量前面。如果第一個(gè)變量對(duì)齊了,其它變量就會(huì)連續(xù)的存放,而且不用填充字節(jié)自然就會(huì)對(duì)齊。有些編譯器在分配變量時(shí)不會(huì)自動(dòng)改變變量順序,有些編譯器不能產(chǎn)生4字節(jié)對(duì)齊的棧,所以4字節(jié)可能不對(duì)齊。下面這個(gè)例子演示了本地變量聲明的重新排序:
    不好的代碼,普通順序 推薦的代碼,改進(jìn)的順序
    short ga, gu, gi;
    long foo, bar;
    double x, y, z[3];
    char a, b;
    float baz;
    double z[3];
    double x, y;
    long foo, bar;
    float baz;
    short ga, gu, gi;
    避免不必要的整數(shù)除法
    整數(shù)除法是整數(shù)運(yùn)算中最慢的,所以應(yīng)該盡可能避免。一種可能減少整數(shù)除法的地方是連除,這里除法可以由乘法代替。這個(gè)替換的副作用是有可能在算乘積時(shí)會(huì)溢出,所以只能在一定范圍的除法中使用。
    不好的代碼 推薦的代碼
    int i, j, k, m;
    m = i / j / k;
    int i, j, k, m;
    m = i / (j * k);