catalog
字节顺序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)
是某个数的倍数, 不是这样的
对齐是: 针对每个变量
实际占用的内存!!! 而不是说所有变量 占用空间的 总和
(这太简单了…)