0%

Packed structure and its related variation

由於現在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];
} ;