结构体内存占用问题

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">首先看一下内置数据类型的内存占用问题,如下表所示(win32):</span>

Name

Size

Range*

char

1byte

signed: -128 to 127
unsigned: 0 to 255

short int (short)

2bytes

signed: -32768 to 32767
unsigned: 0 to 65535

int

4bytes

signed: -231 to 231-1
unsigned: 0 to 232-1

long int (long)

4bytes

signed: -231 to 231-1
unsigned: 0 to 232-1

bool

1byte

true or false

float

4bytes

+/- 3.4e +/- 38 (~7 digits)

double

8bytes

+/- 1.7e +/- 308 (~15 digits)

long double

8bytes

+/- 1.7e +/- 308 (~15 digits)


另外,指针(不管指向什么类型),所占内存为4个字节;内存对齐问题有四条规则:

1、第一个成员变量与结构体变量的偏移量为0;
2、其他成员变量要对齐到某个数字(对齐数)整数倍的位置;
3、对齐数取编译器预设对齐数与该成员大小的较小值;
4、结构体总大小为最大对齐数的整数倍;

验证代码如下:

#include <iostream>
using namespace std;

int main()
{
	char        value_char;
	short       value_short;
	int         value_int;
	long        value_long;
	bool        value_bool;
	float       value_float;
	double      value_double;
	long double value_long_double;
	int *       p_int;
	char *      p_char;
	cout<<"char所占内存为"<<sizeof(value_char)<<"个字节;"<<endl<<endl;
	cout<<"short所占内存为"<<sizeof(value_short)<<"个字节;"<<endl<<endl;
	cout<<"int所占内存为"<<sizeof(value_int)<<"个字节;"<<endl<<endl;
	cout<<"long所占内存为"<<sizeof(value_long)<<"个字节;"<<endl<<endl;
	cout<<"bool所占内存为"<<sizeof(value_bool)<<"个字节;"<<endl<<endl;
	cout<<"float所占内存为"<<sizeof(value_float)<<"个字节;"<<endl<<endl;
	cout<<"double所占内存为"<<sizeof(value_double)<<"个字节;"<<endl<<endl;
	cout<<"long double所占内存为"<<sizeof(value_long_double)<<"个字节;"<<endl<<endl;
	cout<<"指向int的指针所占内存为"<<sizeof(p_int)<<"个字节;"<<endl<<endl;
	cout<<"指向short的指针所占内存为"<<sizeof(p_char)<<"个字节;"<<endl<<endl;
	return 0;
}
执行结果如下图所示:



下面讨论结构体struct内存占用问题,验证代码如下:

#include <iostream>
using namespace std;
int main()
{
	struct test1 
	{
		char        value_char;
		short       value_short;
		int         value_int;
		float       value_float;
		double      value_double;
		int *       p_int;
	};
	struct test2 
	{
		char        value_char;
		int         value_int;
		short       value_short;
		float       value_float;
		double      value_double;
		int *       p_int;
	};
	cout<<"结构体test1所占内存为"<<sizeof(test1)<<"个字节"<<endl<<endl
	    <<"结构体test2所占内存为"<<sizeof(test2)<<"个字节"<<endl<<endl;
	return 0;
}

结构体struct(或联合union)的内存占用问题涉及到字节对齐,在VS里可以进行设置,工程属性 -> 配置属性 -> C/C++ -> 代码生成 -> 结构成员对齐,如下图:


如果选择4字节对齐,成员变量内存占用不到4字节的,相邻几个变量凑够4字节的整数倍,执行结果为:

    

如果选择8字节对齐,成员变量内存占用不到4字节的,相邻几个变量凑够4字节的整数倍,执行结果为:

  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值