我有一个我希望优化足迹的结构。
typedef struct dbentry_s {
struct dbentry_s* t_next;
struct dbentry_s* a_next;
char *t;
char *a;
unsigned char feild_m;
unsigned char feild_s;
unsigned char feild_other;
} dbentry;
据我了解,编译器在您定义内存时会在内存中创建结构。 因此应首先声明较大的类型,以便小类型可以填充对齐孔。
我已阅读WikiPedia关于数据结构调整的文章以及有关该问题的其他文章。 http://en.wikipedia.org/wiki/Data_structure_alignment
但我仍然不确定,我目前的订购是最优的,还是我错过了什么?
注意:我的编译器不支持“#pragma pack”
答案 0 :(得分:5)
不,这应该是基于通用编译器行为的最佳顺序(请记住,标准实际上不会强制关于元素之间的空间如何打包结构,尽管它确保顺序为指定:参见最新草案C1x-n1425的'6.2.5类型'。
你的所有指针都在前面,你的所有字符都在后面,所以你可能会发现,使用四字节指针大小,你最终会得到一个19或20字节的结构。 / p>
您可以通过在代码中插入以下行来轻松检查:
printf ("Size of dbentry* is %d\n", sizeof (struct dbentry_s*));
printf ("Size of char* is %d\n", sizeof (char*));
printf ("Size of uns char is %d\n", sizeof (unsigned char));
printf ("Size of stucture is %d\n", sizeof (dbentry));
我放入所有 sizeof
次检查的原因是为了确保您拥有完整的信息。我很清楚sizeof(char)
总是1。
答案 1 :(得分:1)
您可能有兴趣使用pahole和/或Cruncher#。两者都是分析内存中结构布局的工具。
参考:原始Maciej Sinilo blog post关于Cruncher#。