以结构体成员的访问/修改的频繁程度进行布局,并且配合cacheline长度对齐进行声明,这种布局的好处是: a. 最大化了cpu的cache命中率,性能非常优越,避免false sharing带来的性能开销 b. 举例:linux中mm模块的zone_struct采用了这种思想进行布局 c. 注意点:要配合cacheline长度对齐声明,或者你的结构体大小本身就是cacheline的整数倍,否则如果有其他变量和你的结构体共享了相同的cacheline,那么很可能无法获得性能优势(比如该变量经常被修改,导致你的cacheline经常型的失效) d. 这种声明方式的基本思路:根据访问类型/频率/是否经常性的一起访问或修改,将成员变量归类放在同一条cacheline上.如: a/b是经常一起被修改的, c/d是极少被修改且极少被读取的, e/f是高频被读取极少被修改的.根据这种规律,将访问方式和时间局部性相近的成员变量放在一起. e. 错误的布局: 假设a/b是经常被修改的,但并不是经常一起被修改的,那么你将a/b放在一起就会导致false sharing. f. 这个思想只对c/c++中的POD类型有效,而非POD类型,比如c++ stl等,需要搞清楚这些类的结构体布局
// linux kernel mmzone.htypedefstructzone_struct{/*
* Commonly accessed fields:
*/spinlock_t lock;unsignedlong offset;unsignedlong free_pages;unsignedlong inactive_clean_pages;unsignedlong inactive_dirty_pages;unsignedlong pages_min, pages_low, pages_high;/*
* free areas of different sizes
*/structlist_head inactive_clean_list;free_area_t free_area[MAX_ORDER];/*
* rarely used fields:
*/char*name;unsignedlong size;/*
* Discontig memory support fields.
*/structpglist_data*zone_pgdat;unsignedlong zone_start_paddr;unsignedlong zone_start_mapnr;structpage*zone_mem_map;}zone_t;