結構體的設計主要考慮幾個問題:
1. 編譯環境無關,主要就是sizeof問題,儘量用typedef過的型別,比如DWORD uint32_t,可以準確控制大小,另外位元組對齊也要考慮,最好用#pragma pack也指定對齊方式,可以做到相容32 64位。
2. 節約空間,宣告的順序要想好,最好按照位元組對齊擺放,如果你非要一個 char,一個int地間隔宣告就會浪費很多空間。另外用 陣列還是指標加長度,要好好考慮下,在可預見的未來長度有限就用陣列,否則指標加長度,指標加長度畢竟會導致多一塊記憶體分配,而且這樣結構體不能簡單地透過memcpy複製了,要慎重。如果有好多bool型的值,可以考慮用位來表示 struct { int x:1, int y:1 int z:1 },或者宣告成DWORD,然後用按位宣告的值去或出來,比如 Windows style, WS_VISIBLE | WS_CAPTION3. 前後相容,如果未來可能會修改的,最好在結構體開頭放一個 version,表示版本,使用者要注意檢查版本號,可以保持前後相容,修改了宣告就改下版本號。Windows的做法是放一個cbSize,反正通常改結構體的話sizeof也是會變的。保留幾個 reserve供未來使用也可以。4. 命名,我喜歡給結構體一個統一的字首,而且全大寫,讓人一眼就看出這是個結構,和其他的class interface區分開。
結構體的設計主要考慮幾個問題:
1. 編譯環境無關,主要就是sizeof問題,儘量用typedef過的型別,比如DWORD uint32_t,可以準確控制大小,另外位元組對齊也要考慮,最好用#pragma pack也指定對齊方式,可以做到相容32 64位。
2. 節約空間,宣告的順序要想好,最好按照位元組對齊擺放,如果你非要一個 char,一個int地間隔宣告就會浪費很多空間。另外用 陣列還是指標加長度,要好好考慮下,在可預見的未來長度有限就用陣列,否則指標加長度,指標加長度畢竟會導致多一塊記憶體分配,而且這樣結構體不能簡單地透過memcpy複製了,要慎重。如果有好多bool型的值,可以考慮用位來表示 struct { int x:1, int y:1 int z:1 },或者宣告成DWORD,然後用按位宣告的值去或出來,比如 Windows style, WS_VISIBLE | WS_CAPTION3. 前後相容,如果未來可能會修改的,最好在結構體開頭放一個 version,表示版本,使用者要注意檢查版本號,可以保持前後相容,修改了宣告就改下版本號。Windows的做法是放一個cbSize,反正通常改結構體的話sizeof也是會變的。保留幾個 reserve供未來使用也可以。4. 命名,我喜歡給結構體一個統一的字首,而且全大寫,讓人一眼就看出這是個結構,和其他的class interface區分開。