<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何設計一個優(yōu)秀的結構體

          共 2004字,需瀏覽 5分鐘

           ·

          2021-08-02 23:16

          點擊左上方藍字關注我們



          全網(wǎng)搜集目標檢測相關,人工篩選最優(yōu)價值內(nèi)容

          編者薦語
          結構體是C++中一種重要的數(shù)據(jù)類型,該數(shù)據(jù)類型由一組稱為成員的不同數(shù)據(jù)組成,其中每個成員可以具有不同的類型。結構體通常用來表示類型不同但是又相關的若干數(shù)據(jù)。結構體類型不是由系統(tǒng)定義好的,而是需要程序設計者自己定義的。


          今天這里繼續(xù)聊聊如何設計結構體,注意本文不介紹在C++中結構體和類具體有什么區(qū)別,本文所說的結構體是指只有數(shù)據(jù)字段不帶任何函數(shù)的那種結構體。


          當創(chuàng)建結構體的實例時,結構體的數(shù)據(jù)成員會按其聲明的順序連續(xù)存儲。然而,這個聲明的順序也是有學問的,順序不同結構體的大小可能有很大差別,數(shù)據(jù)成員的訪問性能也可能會有很大區(qū)別!


          大多數(shù)編譯器會對齊數(shù)據(jù)成員,會以四舍五入地址方式來優(yōu)化數(shù)據(jù)的訪問,如下表所示。



          這種內(nèi)存對齊可能會在成員大小混合的結構體中產(chǎn)生未使用字節(jié)的空洞


          例如:

          struct S {    short int a; // 2字節(jié)    // 6個空洞    double b; // 8    int d; // 4    // 4個空洞};S ArrayOfStructures[100];

          這里,在a和b之間有6個未使用的字節(jié),因為b必須從一個能被8整除的地址開始。


          最后還有4個未使用的字節(jié)空洞。這樣做的原因是,數(shù)組中S的下一個實例必須從一個能被8整除的地址開始,以便將其b成員以8對齊。


          然而,如果改變一下結構體中數(shù)據(jù)成員聲明的順序,通過將最小的成員放在最后,未使用的字節(jié)數(shù)可以減少到2:

          struct S {    double b; // 8    int d; // 4    short int a; // 2    // 2個空洞};S ArrayOfStructures[100];

          這種重新排序使結構體變小了8個字節(jié),那整個數(shù)組則變小了800個字節(jié)。


          在此特性上,類和結構體相同。通過重新排序數(shù)據(jù)成員,結構體對象和類對象通??梢宰兊酶?。如果類至少有一個虛成員函數(shù),則在第一個數(shù)據(jù)成員之前或最后一個成員之后會有一個指向虛函數(shù)表的指針。該指針在32位系統(tǒng)中為4字節(jié),在64位系統(tǒng)中為8字節(jié)。


          如果不確定結構體或它的每個成員有多大,可以使用sizeof操作符進行一些測試。sizeof操作符返回的值包括對象末尾的任何未使用的字節(jié)(內(nèi)存對齊后的字節(jié)數(shù))。


          還有一個知識點:


          如果數(shù)據(jù)成員相對于結構體或類開頭的偏移量小于128,則訪問數(shù)據(jù)成員的代碼會更加緊湊,因為該偏移量可以使用8位有符號的數(shù)字來表示。如果相對于結構體或類的開頭的偏移量是128字節(jié)或更多,那么偏移量必須表示為一個32位數(shù)字(指令集在8位到32位之間沒有偏移量)。例如:

          struct S {    int a[100]; // 400    int b; // 4    int read() { return b; }};


          b成員的偏移量是400。任何通過指針或成員函數(shù)訪問b字段的代碼都需要將偏移量編碼為32位數(shù)字。如果交換a和b,則兩者都可以通過編碼為8位有符號數(shù)字的偏移量來訪問,或者根本不需要偏移量。


          這會使代碼更緊湊,方便更有效地使用代碼緩存。因此,建議在結構或類聲明中,大數(shù)組和其他大對象排在最后,最常用的數(shù)據(jù)成員排在前面。如果不能在前128個字節(jié)內(nèi)包含所有數(shù)據(jù)成員,則將最常用的成員放在前128個字節(jié)中。


          通過上面兩個小知識點可以使得將結構體設計的更小,訪問數(shù)據(jù)成員的速度更快,但是這有時往往會犧牲一些可讀性,比如這種結構體:

          struct S {    int deskA;    double deskB;    bool deskC;    int chairA;    double chairB;    bool chairC;};

          可能這樣修改后結構體會更?。?/p>

          struct S {    int deskA;    int chairA;    double deskB;    double chairB;    bool deskC;    bool chairC;};

          但是我們一般情況下貌似希望同類的字段放在一起,這樣代碼可讀性更高一些,易于讀懂代碼。至于這種結構體具體需不需要重新排序,那就需要大家自己權衡啦。


          小總結:

          • 注意內(nèi)存對齊;

          • 128是個檻,常用的數(shù)據(jù)成員可考慮放在前128字節(jié)中,不常用的或大的數(shù)據(jù)成員可考慮放在后面;

          • 注重性能優(yōu)化的同時也需要權衡一下代碼的可讀性。


          打完收工。


          END



          雙一流大學研究生團隊創(chuàng)建,專注于目標檢測與深度學習,希望可以將分享變成一種習慣!

          整理不易,點贊三連↓

          瀏覽 36
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美成人无码在线 | 在线观看日本国产 | 中国农村乱婬片AA片 | 欧美系列综合 | 蜜桃臀久久久蜜桃臀久久 |