1、sizeof定义
sizeof是个操作符,它的作用是计算一个对象在内存所占内存的字节数,并返回这个字节数;
返回的类型是size_t.
2、怎么用?(语法)
比如有个整数型的变量
int i = 10;
第一种:sizeof(int);(int、float、double等等)
第二种:sizeof i;
第三种:sizeof(类型/对象);
-
//32位机子下
-
int i;
-
sizeof( int); //字节数为4个字节
-
sizeof(i); //4个字节
-
sizeof i; //4个字节
-
-
size( float); //4个字节
-
size( double); //8个字节
3、结构体的sizeof
结构体的用法和2的用法一样,但是里面涉及到一个数据对齐的问题。
如上面两个结构体A,B
-
struct
-
{
-
char a;
-
double b;
-
char c;
-
}A;
-
-
struct
-
{
-
double b;
-
char a;
-
char c;
-
}B;
如上面两个结构体A,B
他们的字节数分别为:
sizeof(A) : 24
sizeof(B) : 16
A的实际对齐情况为如下:
|char|------|------|------|
|---------double--------|
|char|------|------|------|
比如结构体A的字节数计算:
它不是按照sizeof(A) = sizeof(a)+sizeof(b)+sizeof(c) = 1+8+1=10来计算的!!
请注意不是按照上述情况计算的!
结构的计算字节数有几个原则:
原则1:
以结构体字节数最大数据类型的倍数做偏移量对齐;
如A结构体包含了char和double
那就以double的字节数成倍偏移进行对齐
那A的字节数计算为
sizeof(A) = sizeof(b)*3 = 8*3=24
那结构体B的计算为什么是16个字节啊?!
这就是下面的原则了
原则2:
如果结构体中连续的基础数据类型没有超过结构体最大的数据类型的字节数,则可以“拼”在一块
B的实际对齐情况为如下:
|---------double--------|
|char|char|------|------|
所以sizeof(B) = sizeof(b)*2 = 8*2 = 16
具体为什么可以这么做,我没有看到比较好的通俗解释,如果有同学看到了欢迎交流!
以此类推
-
struct
-
{
-
double a;
-
char b;
-
int c;
-
}C; // 字节数为16
-
-
struct
-
{
-
double a;
-
int b;
-
int c;
-
}D; //字节数为16