1.字节与位
1个字节(byte)是8个比特(bit).
位(bit):计算机中数据的基本单位,每8位配置一个字节。 在计算机上存储和处理各种信息至少需要一个字节。
8位01代码可表示2^8个数,0000000-1111111.
Int8等于字节,占用1个字节。
字节相当于字节(unsigned char ) 0到255
Int16表示16位整数(16位integer ),相当于short占2字节-32768 ~ 32767
Int32表示32位整数(32位integer ),int相当于4字节-2147483648 ~ 2147483647(C/C++中int型一般为4个字节)
Int64表示64位整数(64位interger ),long为8字节),相当于922337203685475808~922337203685475807
2. 内存对齐
#include <iostream>
using namespace std;
struct st1 { char a ; int b ; short c ;};
struct st2 { short c ; char a ; int b ;};
int main(){
cout<<"sizeof(st1) -> "<<sizeof(st1)<<endl; // sizeof(st1) ->12
cout<<"sizeof(st2) -> "<<sizeof(st2)<<endl; // sizeof(st2) ->8
return 0 ;
}
结构体内部成员顺序变化时,此处输出结果不同,原因就是内存对齐。
什么是对齐
现代计算机中内存空间都是按照 byte 划分的,从理论上讲似乎对任何类型的变量的访问都可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问。
所以这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。内存对齐又分为自然对齐和规则对齐。
对于内存对齐问题,主要存在于 struct 和 union 等复合结构在内存中的分布情况,许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们要求这些数据的首地址的值是某个数M(通常是4或8);
对于内存对齐,主要是为了提高程序的性能,数据结构,特别是栈,应尽可能在自然边界上对齐,经过对齐后,cpu 的内存访问速度大大提升。
自然对齐
指的是将对应变量类型存入对应地址值的内存空间,即数据要根据其数据类型存放到以其数据类型为倍数的地址处。
例如 char 类型占1个字节空间,1的倍数是所有数,因此可以放置在任何允许地址处,而int类型占4个字节空间,以4为倍数的地址就有0,4,8等。编译器会优先按照自然对齐进行数据地址分配。
规则对齐
以结构体为例就是在自然对齐后,编译器将对自然对齐产生的空隙内存填充无效数据,且填充后结构体占内存空间为结构体内占内存空间最大的数据类型成员变量的整数倍。
以上面代码为例
结构体st1 在内存中的存储情况为
橙色a表示char 占一个字节,蓝色b表示int占4个字节,在内存中int是在4个倍数上存储,所以b并不是与a连续存储,而是空了3个字节之后存储,黄色c表示short占2个字节,需要地址在2的整数倍上存储,与b是连续存储的,结构的类型的存储单位需要为最大数据类型的整数倍,其中 (1+3) + 4 + 2 为 10字节 ,而最大数据类型int类型为4个字节,所以最终需要填充2个字节,所以结构体st1的大小为12个字节。