c - 结构大小优化

标签 c optimization cpu-architecture

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

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;

据我了解,编译器会在您定义结构时在内存中创建它们。 因此,应首先声明较大的类型,以便较小的类型可以填充对齐孔。

我已阅读有关数据结构对齐的维基百科文章和其他有关该问题的文章。 http://en.wikipedia.org/wiki/Data_structure_alignment

但我仍然不确定,我当前的顺序是最优的还是我遗漏了什么?

注意:我的编译器不支持“#pragma pack”

最佳答案

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

所有的指针都在前面,所有的字符都在后面,所以您可能会发现,对于四字节的指针大小,您最终会得到一个 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));

我在 all sizeof 检查中加入的原因是为了确保您拥有完整的信息。我很清楚 sizeof(char) 始终为 1。

关于c - 结构大小优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1935392/

相关文章:

c - _POSIX_ 与 _POSIX_SOURCE 与 _POSIX_C_SOURCE

c++ - 如何使用 SSE(1,2,3,4) 优化?

c - 二进制 "become"什么时候是十进制或十六进制?十六进制 "faster"是十进制吗?

cpu - RAM提取16位或128位所需的时间相同吗?

memory - 内存地址是否总是指一个字节,而不是一位?

调用使用指针接收数组的函数

C qsort 嵌套结构数组

c++ - 为什么这个函数调用后数组发生了变化?

c++ - GCC 优化在运行时产生 "Undefined symbol"

c++ - 应用程序的缓存友好设计