由於現在CPU對於Memory Byte Algined的處理較好,所以很多資料結構的擺法都會偏向於4 Byte Alginment的方式進行。例如
1 2 3 4
| struct string_t { int length; char val[1]; } ;
|
string_t的大小為8,而非眾人想像中的5,如果要強制讓這個Structure大小為5的話,可以採用以下這種方式。
1 2 3 4 5 6 7 8 9 10 11 12
| // GCC Style struct string_t { int length; char val[1]; } __attribute__ ((packed)); // Visual C++ Style #pragma pack(push,1) struct string_t { int length; char val[1]; } ; #pragma pack(pop)
|
如果不用這兩種方式的話,如何使用投機的方式來減少分配
1 2 3 4 5 6 7 8
| #include <stddef.h> struct string_t *allocstr(int len, char *str) { struct string_t *string = malloc(offsetof(struct string_t, str) + len + 1); string->length = len; memcpy(string->str, str, len); return string; }
|
其實上面那個char val[1]也是不需要的,在支援zero array之後,用這個方式更簡單
1 2 3 4
| struct string_t { int length; char val[0]; } ;
|