在结构中安排字段的方式更好?

我有两种方法来安排结构中的字段

struct foo { float a; double b; float c; double d; short e; long f; short g; long h; char i; int j; char k; int l; }; struct foo { double b; double d; long f; long h; float a; float c; int j; int l; short e; short g; char i; char k; }; 

应该练习哪一个?为什么?

排列结构成员的最佳方法是按其大小按顺序放置它们。 这样做可以减少 数据对齐所需的填充 。

此外,使用一些预处理程序指令可以修改对齐,例如:

 #define packed_data __attribute__((__packed__)) 

把它关掉 使用这个,成员顺序不再重要,但我强烈反对这一点,因为内存alingnment针对性能进行了优化。

第二种安排是可取的。

在结构中,最小化由填充引起的位存储损失

(存储器中各种变量的边界对齐),最好开始

具有最大尺寸变量的结构。 从较高到较小的尺寸。

  1. 请参阅结构中的填充

  2. C中变量类型的大小

    http://www.cquestions.com/2011/02/size-of-data-types-in-c.html

排序字段的一种合理方式是它们的目的相似。 例如:

 struct window { MENU *menu ; int width ; char *name ; WINDOW *child ; int xpos ; int height ; void *info ; WINDOW *next ; CLASS *class ; int ypos ; WINDOW *parent ; } 

看起来会更好

 struct window { CLASS *class ; void *info ; char *name ; int xpos ; int ypos ; int width ; int height ; WINDOW *parent ; WINDOW *next ; WINDOW *child ; MENU *menu ; } 

填充是支持一种安排而不是另一种安排的一个原因。 另一种选择是按字段的频率或内存访问模式对字段进行排序。 这当然是微优化,但在极端情况下可以获得回报。

许多或大多数CPU架构在具有较小操作码的指针中编码较小的偏移量; 将最常访问的元素置于零偏移可以在特别是RISC架构中减少指令数量,并使代码运行得更快。

如果’y’与’y’同时使用,将它们放在同一缓存行中是有益的,而不是面临每个结构有两个或更多缓存未命中的风险。