我有两种方法来安排结构中的字段
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;
};
应该练习哪一个?为什么?
答案 0 :(得分:2)
排列结构成员的最佳方法是按其大小按顺序放置它们。 Doing this, you reduce the padding需要data alignment。
另外,使用一些preprocessor directives可以修改对齐方式,例如:
#define packed_data __attribute__((__packed__))
将其关闭。使用这个,成员顺序不再重要,但我强烈反对这一点,因为内存分配已针对性能进行了优化。
答案 1 :(得分:1)
第二种安排更可取。
在结构中,最小化由填充引起的位存储丢失
(存储器中各种变量的边界对齐),最好开始
具有最大尺寸变量的结构。从较高到较小。
请参阅结构中的填充
C
中变量类型的大小(http://www.cquestions.com/2011/02/size-of-data-types-in-c.html)
答案 2 :(得分:0)
排序字段的一种合理方式是它们的目的相似。 例如:
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 ;
}
答案 3 :(得分:0)
填充是支持一种安排而不是另一种安排的一个原因。另一种选择是按字段的频率或内存访问模式对字段进行排序。这当然是微优化,但在极端情况下可以获得回报。
许多或大多数CPU架构在具有较小操作码的指针中编码较小的偏移量;将最常访问的元素偏移为零可以在特别是RISC架构中减少指令数量,并使代码运行得更快。
如果'y'与'y'同时使用,将它们放在同一个缓存行中是有益的,而不是面临每个结构有两个或更多缓存未命中的风险。