博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
内存结构体对齐总结
阅读量:4129 次
发布时间:2019-05-25

本文共 982 字,大约阅读时间需要 3 分钟。

结构体对齐目的:

1:访问速度:为了不让同一个变量(同时包括整个结构变量和结构体内部成员变量)分布在多个cache line上,然后两次访问内存。

2:平台限制:有些平台不能随意读取某个偏移的地址变量

如结构体:

struct AT
{


    char a;
    char b;
    int  c;
    char d;
};

因为cpu是以cacheline为单位读写内存的。如x86_64的cacheline的大小为8个字节共64位,利用这一特性我们能做什么优化呢?

1:结构体起始地址尽量是cacheline的整数倍。

2:结构体变量尽量是cacheline的整数倍。

3:结构体成员变量尽量是在同一个cacheline中。(特别是要访问连续的几个成员变量情况,可以一次性读入)

当然下面这种情况需要认为代码中避免的:如果两个成员变量被不同的core频繁修改的话(cache一致性维护代价非常高),那最好不要将这两个变量落到同一个cache line中。

从上面得出一个宗旨:同一个成员变量不要跨cache line:

具体做法:找到一个最小单位n,它取决于下面的最小值:

1:人为指定:#pragma pack指定的数值

2:cache line大小

3:结构体内部最大的基本数据类型成员

当确定好n时,之后的对齐规则是:

1:结构体变量起始地址为n的整数倍

2:结构体成员变量的地址规则:取min(自身大小,n大小)

a:当自身大小大于等于n时,那么地址为n的整数倍:如

#pragma pack(4)struct s7{	char a;	double d;};#pragma pack()double为8,cacheline为8,指定为4;那么n为4;sizeof(s7)为12

b:当自身大小小于n时:那么为自身大小的的整数倍:如:

struct s5{	char a;	char b;	int  c;	double d;};doube为8,cacheline为8,没有指定,那么n为8,sizeof(s5)为16

3:总长度为n的总数倍,如:

struct s6{	char a;	char b;	double d;	int  c;};double为8,cacheline为8,那么n为8,sizeof(s6)为24

写代码的时候有一个宗旨:按所占字节大小从小到大排序。

转载地址:http://lquvi.baihongyu.com/

你可能感兴趣的文章
[转]C语言printf
查看>>
C 语言 学习---获取文本框内容及字符串拼接
查看>>
C 语言学习 --设置文本框内容及进制转换
查看>>
C 语言 学习---判断文本框取得的数是否是整数
查看>>
C 语言 学习---ComboBox相关、简单计算器
查看>>
C 语言 学习---ComboBox相关、简易“假”管理系统
查看>>
C 语言 学习---回调、时间定时更新程序
查看>>
C 语言 学习---复选框及列表框的使用
查看>>
第十一章 - 直接内存
查看>>
JDBC核心技术 - 上篇
查看>>
一篇搞懂Java反射机制
查看>>
application/x-www-form-urlencoded、multipart/form-data、text/plain
查看>>
Longest Common Prefix -最长公共前缀
查看>>
Letter Combinations of a Phone Number
查看>>
Single Number II --出现一次的数(重)
查看>>
Valid Parentheses --括号匹配
查看>>
Count and Say
查看>>
Palindrome Partitioning --回文切割 深搜(重重)
查看>>
Valid Palindrome 简单的回文判断
查看>>
对话周鸿袆:从程序员创业谈起
查看>>