常用变量占用内存的大小&&内存对齐方式&&#pragma pack

                   32位系统:     64位系统
类型              大小           大小
char               1             1
char *             4             8

int                4             4
int  *             4             8
short              2             2
short int          2             2
long               4             4
long int           4             4
long long          8             8
unsigned long long 8             8

double             8             8
long double        8             8

float              4             4

bool               1             1


自己写个代码运行一下就一目了然了

    cout << "char               " << sizeof(char) << endl;
	cout << "char *             " << sizeof(char*) << endl;
	cout << endl;
	cout << "int                " << sizeof(int) << endl;
	cout << "int *              " << sizeof(int*) << endl;
	cout << "short              " << sizeof(short) << endl;
	cout << "short *            " << sizeof(short*) << endl;
	cout << "short int          " << sizeof(short int) << endl;
	cout << "long               " << sizeof(long) << endl;
	cout << "long *             " << sizeof(long*) << endl;
	cout << "long int           " << sizeof(long int) << endl;
	cout << "long long          " << sizeof(long long) << endl;
	cout << "unsigned long long " << sizeof(unsigned long long) << endl;
	cout << endl;
	cout << "double             " << sizeof(double) << endl;
	cout << "double *           " << sizeof(double*) << endl;
	cout << "long double        " << sizeof(long double) << endl;
	cout << endl;
	cout << "float              " << sizeof(float) << endl;
	cout << "float *            " << sizeof(float*) << endl;
	cout << endl;
	cout << "bool               " <<sizeof(bool)<< endl;

指针类型变量32位系统占4个字节 64位系统占8个字节

举个栗子:

32位系统
int* a      sizeof(a)=4
int  a[4]   sizeof(a)=16//一个int占用4个位

64位系统
int* a      sizeof(a)=8
int  a[4]   sizeof(a)=16//一个int占用4个位

关于结构体字节对齐问题

struct Struct1
	{
		char a[10];
		char b[3];
			
	};
    cout <<"Struct1  "<< sizeof(Struct1) << endl;

输出的结果为 Struct1  13


struct Struct2
	{
		char a[10];
		double b[3];

	};
	cout << "Struct2  " << sizeof(Struct2) << endl;

输出的结果为 Struct2  40

关于结构体字节对齐原则

寻找结构体成员变量中占用内存空间最大的那个元素,以其地址的整数倍为单位。比如结构体有变量类型char int double,则计算时应该以double占用的字节数(8位)的整数倍为准,不够8的整数倍时会自动补齐。比如上面的结构体Struct2,char a[10]大小为10,double b[3]大小为24,手指头算了一下以为会是34,但是执行结果为40,其原理就是34以8对齐的最小上界整数是40,故执行结果为40。

关于#pragma pack

通过#pragma pack可以自己设定对齐方式,但是编译时会在#pragma pack设定的值和默认的值中选择最小的值作为对齐的单位

再举个栗子:

#pragma pack(2)	
struct Struct1
{
	char a[13];
};
cout <<"Struct1  "<< sizeof(Struct1) << endl;

输出结果为 Struct1  13

尽管我们自己设定的大小是2个字节,但是char默认是1个字节,所以取小的值为对齐的单位。
那大家猜猜下面的代码输出的结果会是什么?

#pragma pack(2)	
struct Struct1
{
	char a[13];
	int b;
			
};
cout <<"Struct1  "<< sizeof(Struct1) << endl;

如果你说出的答案是18,则恭喜你已经很好的理解了对齐方式了。
因为我们定义以2字节对齐,结构体默认的是以4字节对齐,选最小的整数2对齐,则结果当然是18而不是20啦。
看到一篇写的很好的文章分享给大家:5分钟搞定内存字节对齐

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值