1.C++基本类型所占字节数
类型 | 16位 | 32位 | 64位 |
char | 1 | 1 | 1 |
char*(指针变量) | 2 | 4 | 8 |
short | 2 | 2 | 2 |
int | 2 | 4 | 4 |
unsigned int | 2 | 4 | 4 |
long | 4 | 4 | 8 |
unsigned long | 4 | 4 | 8 |
long long | 8 | 8 | 8 |
float | 4 | 4 | 4 |
double | 8 | 8 | 8 |
2.C++内存字节补齐
在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。
例如,下面的结构各成员空间分配情况:
e.g.1:
struct test
{
char a;
short b;
float c;
char d;
};
结构的第一个成员a为char类型,其自然对界为1,其偏移地址为0,占据了第1个字节。第二个成员b为short类型,其自然对界为2,起始地址必须2字节对界,因此,编译器在b和a之间填充了一个空字节。结构的第三个成员c和第四个成员d恰好落在其自然对界地址上,在它们前面不需要额外的填充字节。在test结构中,成员c要求4字节对界,是该结构所有成员中要求的最大对界单元,因而test结构的自然对界条件为4字节,编译器在成员d后面填充了3个空字节(因为填充之前为9字节,不是4的倍数)。整个结构所占据空间为12字节。
e.g.2:
struct tagS1
{
//假设地址从0开始,这里最长的类型为_unT1,长度为8...
//变量的首地址为地址模sizeof(变量类型)结果为0的地址开始
char a;//0 (0模1==0,所以从0开始)
int n;//4-7 (2和3模4不等于0,从4开始)
_unT1 t1;//8-15(8模8等于0,从8开始)
long l;//16-19(16模4等于0,从16开始)
char sz[22];//20-41(20模1等于0,从20开始)
};
//由于0-41的长度为42,42不为8的倍数(8是最大对界单元),所以补长为8的倍数,结果为48
3.const关键字定义指针
int const *p = &i 定义了指向int型常量的指针,等价于 const int *p,i的值不能变,p的指向可以变。
int *const p = &i 定义了指向int型变量的常量指针,i的值可以变,p的指向不能变。
4.顶层const、底层const
对于指针、引用(间接变量),const可以分为顶层和底层:
顶层const,表示对象本身的常量性:int *const p = &i;
底层const,表示所指对象的常量性:const int *p = &i; const int &r = i;( const int &r 和 int const &r一样,引用&只有底层const)
const int *const p = &i;//第一个const是底层const,说明i的常量性,第二个是顶层const说明p的常量性