在结构中安排字段的方式更好?
我有两种方法来安排结构中的字段
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针对性能进行了优化。
第二种安排是可取的。
在结构中,最小化由填充引起的位存储损失
(存储器中各种变量的边界对齐),最好开始
具有最大尺寸变量的结构。 从较高到较小的尺寸。
-
请参阅结构中的填充
-
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’同时使用,将它们放在同一缓存行中是有益的,而不是面临每个结构有两个或更多缓存未命中的风险。