1、内存对齐
为什么要内存对齐?
内存对齐,CPU通过寄存器一次读取完成的字节数
如果一个值跨过两次读取,就需要读取两次寄存器,并把这两次寄存器放在一个寄存器中
内存对齐规则
对于结构(或联合)的各个成员,第一个成员位于偏移为0,以后每个数据成员的偏移量必须是#pragma pack指定的数值和结构体(或联合)中最大数据成员长度 这2个数值中较小的一个的倍数。
使用伪代码表示: min(#pragma pack, 结构最大数据成员长度) * N
在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐也按照#pragma pack指定的数值和结构(或联合)最大数据成员长度这2个数值中较小的一个进行。
如果没有使用#pragma pack指令来显式的指定内存对齐的字节数,则按照默认字节数来对齐,各个平台的默认对齐规则如下:32位CPU默认按照4字节对齐;64位CPU默认按照8字节对齐。
2、define 两个注意点:
1 ()使用
2 每个元素是否有计算
#ABCD <==> "ABCD"
A##B <==> AB
#define CALL_WITH_MAX(a,b) f((a) > (b) ? (a) : (b))
int a = 5;
int b = 0;
CALL_WITH_MAX(++a, b); //a被累加两次
CALL_WITH_MAX(++a, b + 10); //a被累加一次
3、const用法
const在*左边,不能修改指针所指向的内容
const在*右边,不能修改指针
const in* p; p的内容为常量
int * const p; p为常量