对齐规则, 字节顺序

字节顺序Endianness

Big endian大端: 高位在低地址, 低位在高地址; 反比
Little endian小端: 高位在高地址, 低位在低地址; 正比


0xABCD
___先从(数位)的角度看, AB是高位, CD是低位;
___如果AB所在的地址, 比CD的地址, 大; 这是(小端)


X86, X86_64是使用的 (小端)


int a = 7;
char * ptr = (char *)&a;
if( ptr[ 0] == '\x7'){  // 不管大小端, ptr[ 0]一定是低地址;  不同的的, 他存储的值 '
    DE<< "system is little-Endian";
}
else{
    DE<< "system is big-Endian";
}

变量对齐

int a;			' a的地址是X '
double b;		' b的地址是 X + 8 '

说明: int a, 虽然是4字节, 但他实际是占了8字节, 补齐到了8字节.

(这个情况, 不管是在全局域, 还是在 类的成员变量, 都会有这个情况!!!)

但如果这是在 (栈)里的 临时变量,, 则不会 出现(对齐). b的地址, 会是X + 4


所以,

class ST{
	int a;		'实际是8'
	double b;	'实际是8'
	int c;		'实际是8'
}

计算ST的大小, 并不是简单的: 4 + 8 + 4 然后再补齐到 8的倍数. (ST的大小, 实际是: 24!!)

class ST{
	char a;		'实际是2'
	short b;	'实际是2'
	int c;		'实际是4'
};

也不是说, 每个变量, 都占max( all_type)的大小. 好像很复杂…

class ST{
	char a;		'实际是1'
	bool b;		'实际是1'
	char c;		'实际是1'
};

sizeof( ST) == 3

所谓的对齐, 不是说 sizeof(ST) 是某个数的倍数, 不是这样的
对齐是: 针对每个变量 实际占用的内存!!! 而不是说所有变量 占用空间的 总和(这太简单了…)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值