2

我有一个我想优化其足迹的结构。

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”

4

2 回答 2

5

不,这应该是基于常见编译器行为的最佳顺序(请记住,该标准实际上并没有规定结构如何根据元素之间的空间进行打包,尽管它确实保证了顺序是指定的:参见最新草案 C1x-n1425 的“6.2.5 类型”)。

您的所有指针都在前面,所有字符都在后面,所以您可能会发现,如果指针大小为 4 字节,您最终会得到一个 19 或 20 字节的结构。

您可以通过在代码中插入以下行来轻松检查这一点:

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。

于 2009-12-20T09:52:23.957 回答
2

您可能对使用pahole和/或Cruncher#感兴趣。两者都是分析内存中结构布局的工具。

参考:关于 Cruncher#的​​原始Maciej Sinilo 博客文章。

于 2009-12-20T11:52:23.120 回答