C++中不同类型变量的内存

0.前言

    许多编程初学者,第一个接触的比较重要的就是变量,变量分为很多种的类型,更加确切的说是数据的类型。简单的数据类型的划分为下图,大家可以进行简单的了解。我们本章主要讨论的是不同的数据的类型占用的内存大小,这也是学习计算机的需要具备的最基础的常识。

    

1.变量的类型

    在编程学习中,我们的常见的数据类型有:

    char , short  ,int  ,unsigned int , long  ,long long  ,float  ,double

    还有指针类型 chat * , int * , float * , double *

2.变量的内存

    2.1 常用的数据类型

    变量类型的内存大小其实是与操作系统有关系的,或者说与编译器的运行环境有关系,在32位操作系统中:

    

常用数据类型内存

数据类型占用内存
char1B
bool1B
short2B
int4B
unsigned int4B
long4B
long long8B
float4B
double8B
char *4B
int *4B
float *4B

    我们使用win32环境进行测试,代码如下:

    

#include "iostream"
using namespace std;

int main(){

	char ch;
	short sh;
	int in;
	long lo;
	long long llo;
	unsigned int unin;
	float fl;
	double dou;
	char * chx;
	int * inx;
	float * flx;
	cout << "char         占用内存大小:" << sizeof(ch) << "B" << endl;
	cout << "short        占用内存大小:" << sizeof(sh) << "B" << endl;
	cout << "int          占用内存大小:" << sizeof(in) << "B" << endl;
	cout << "long         占用内存大小:" << sizeof(lo) << "B" << endl;
	cout << "long long    占用内存大小:" << sizeof(llo) << "B" << endl;
	cout << "usigened int 占用内存大小:" << sizeof(unin) << "B" << endl;
	cout << "float        占用内存大小:" << sizeof(fl) << "B" << endl;
	cout << "double       占用内存大小:" << sizeof(dou) << "B" << endl;
	cout << "char *       占用内存大小:" << sizeof(chx) << "B" << endl;
	cout << "int *        占用内存大小:" << sizeof(inx) << "B" << endl;
	cout << "float *      占用内存大小:" << sizeof(flx) << "B" << endl;
}

    测试结果如下:

char         占用内存大小:1B
short        占用内存大小:2B
int          占用内存大小:4B
long         占用内存大小:4B
long long    占用内存大小:8B
usigened int 占用内存大小:4B
float        占用内存大小:4B
double       占用内存大小:8B
char *       占用内存大小:4B
int *        占用内存大小:4B
float *      占用内存大小:4B

    2.2 结构体

    对于结构体来说,结构体的每一个的数据的存储都是按照单元来进行存储的,单元的大小取决于结构体中最大的内存的数据类型占用的字节数。

    细化一点,对于结构体,内部每一个类型都会以结构体中最大的内存的数据类型占用的字节数为单元进行开辟,但是在开辟之前,要以本身为最小粒度从已经开辟的上一个存储单元的内存的首地址进行移位比对,如果有空闲的内存则存储(足够),否则开辟最大单元内存进行存储。

    测试代码如下:

    

#include "iostream"
using namespace std;

struct typeA{
	char a;
	char b;
	char c;
};
struct typeB{
	char a;
	int b;
	char c;
};
struct typeC{
	char a; 
	short b;
	int c;
};
struct typeD{
	char a;
	int b;
	long long c;

};
struct typeE{
	char a;
	long long c;
	int b;
	
};

int main(){

	typeA a;
	typeB b;
	typeC c;
	typeD d;
	typeE e;
	cout << "typeA   占用的内存大小:"<<sizeof(a) <<"B"<< endl;
	cout << "typeB   占用的内存大小:" << sizeof(b) << "B" << endl;
	cout << "typeC   占用的内存大小:" << sizeof(c) << "B" << endl;
	cout << "typeD   占用的内存大小:" << sizeof(d) << "B" << endl;
	cout << "typeE   占用的内存大小:" << sizeof(e) << "B" << endl;
}

    测试结果如下:

typeA   占用的内存大小:3B
typeB   占用的内存大小:12B
typeC   占用的内存大小:8B
typeD   占用的内存大小:16B
typeE   占用的内存大小:24B

    分析如下:

    

typeA

A
A
A

typeB

Anullnullnull
BBBB
Cnullnullnull

typeC

ABBnull
CCCC

typeD

ABBBBnullnullnull
CCCCCCCC

typeE

Anullnullnullnullnullnullnull
CCCCCCCC
BBBBnullnullnullnull

3.总结

    对于不同的数据结构,内部的存储都具有一定的规律,本章主要讲解一些简单常用的数据类型的内存。对于结构体的存储,关系到宽字符的对齐,需要经过一定的判断。另外,对于类的存储和实例化,可能机制会更加复杂,我们将会在后面的章节讲到。

转载于:https://my.oschina.net/u/3520549/blog/1528311

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值