1、基本数据类型
cout << sizeof(char); // 结果是1
cout << sizeof(int); // 结果是4
cout << sizeof(unsigned int); // 结果是4
cout << sizeof(long int); // 结果是4
cout << sizeof(short int); // 结果是2
cout << sizeof(float); // 结果是4
cout << sizeof(double); // 结果是8
2、数组的sizeof数组的sizeof值等于数组所占用的内存字节数
char c[] = "hello";
int a[3];
sizeof( c ); // 结果为6,字符末尾还存在一个NULL终止符
sizeof( a ); // 结果为3*4=12
3、操作数是联合类型时,sizeof是其最大字节成员的字节数
union un
{
char c;
int a;
}U;
sizeof(U) = max(sizeof(c),sizeof(a)) = sizeof(1,4) = 4;
4、 sizeof结构体的内存对齐问题
struct poll{
char a;
int b;
short c;
};
sizeof(poll); //大小为12
struct m_s{
double a;
int b;
char c;
};
sizeof(m_s); //大小为16
5、#pragma pack()的用法
1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。
二字节对齐:
#include <stdio.h>
#pragma pack(2)
typedef struct
{
int aa1; //2个字节对齐 11 11
char bb1;//1个字节对齐 1
short cc1;//2个字节对齐 011
char dd1; //1个字节对齐 1
} test;
int length = sizeof(test); //2个字节对齐,占用字节11 11 10 11 10,length = 10
四字节对齐:
#include <stdio.h>
#pragma pack(4)
typedef struct
{
int aa1; //4个字节对齐 1111
char bb1;//1个字节对齐 1
short cc1;//2个字节对齐 011
char dd1; //1个字节对齐 1
} test;
int length = sizeof(test); //2个字节对齐,占用字节1111 1011 1000,length = 12
6、类
空类是会占用内存空间的,而且大小是1,原因是C++要求每个实例在内存中都有独一无二的地址。
(一)类内部的成员变量:
- 普通的变量:是要占用内存的,但是要注意对齐原则(这点和struct类型很相似)。
- static修饰的静态变量:不占用内容,原因是编译器将其放在全局变量区。
(二)类内部的成员函数:
- 普通函数:不占用内存。
- 虚函数:要占用4个字节,用来指定虚函数的虚拟函数表的入口地址。所以一个类的虚函数所占用的地址是不变的,和虚函数的个数是没有关系的
class cBase{};
sizeof(cBase); //大小为1
#pragma pack(4)
class CBase1
{
private:
char c;
short sh;
int a;
public:
void fOut(){ cout << "hello" << endl; }
};
sizeof(CBase1); //大小为8,如果有虚函数,则大小增加4