文档章节

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

zhaoWSW
 zhaoWSW
发布于 2017/09/03 22:14
字数 1084
阅读 10
收藏 0

0.前言

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

    

1.变量的类型

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

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

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

2.变量的内存

    2.1 常用的数据类型

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

    

常用数据类型内存

数据类型 占用内存
char 1B
bool 1B
short 2B
int 4B
unsigned int 4B
long 4B
long long 8B
float 4B
double 8B
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

A null null null
B B B B
C null null null

typeC

A B B null
C C C C

typeD

A B B B B null null null
C C C C C C C C

typeE

A null null null null null null null
C C C C C C C C
B B B B null null null null

3.总结

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

© 著作权归作者所有

共有 人打赏支持
上一篇: 线性表查找
下一篇: 线性表查找
zhaoWSW
粉丝 0
博文 2
码字总数 2128
作品 0
绵阳
私信 提问
计算机专业C语言编程学习重点:指针化难为易

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
05/31
0
0
C++基础教程之C/C++区别

C/C++基础教程之C/C++区别 这是C++教程得第一步,后续会持续更新哦!欢迎新手(具有C基础),老鸟可绕道,可指导。 C++标准输入和输出 C++标准输入和输出分别是cin和cout,用法非常简单 cin>>n...

这个人很懒什么都没留下
09/01
0
0
C# vs C++之二:GC vs RAII

C# vs C++之二:GC vs RAII 资源管理 C中资源管理极为繁琐易错,大多复杂C系统都面临内存泄露、悬挂指针等问题 一方面由底层语言特点决定;另一方面也由于C语言特性相对较少,严重依赖程序员...

ddatsh
2011/06/28
1K
6
5-C++远征之离港篇-学习笔记

C++远征离港篇 离港总动员 C++远征计划的学习者肯定是冲着封装,继承,多态来的。 知识点: 指针 VS 引用 函数默认值 & 函数重载 内存管理(头疼): 堆中的内存管理几乎完全由程序员操心[出来混...

天涯明月笙
07/20
0
0
C++中extern “C”含义深层探索

1.引言 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言,C++保留了一部分过程式语言...

长平狐
2013/01/06
38
0

没有更多内容

加载失败,请刷新页面

加载更多

jquery通过id显示隐藏

var $div3 = $('#div3'); 显示 $div3.show(); 隐藏 $div3.hide();

yan_liu
今天
3
0
《乱世佳人》读书笔记及相关感悟3900字

《乱世佳人》读书笔记及相关感悟3900字: 之前一直听「荔枝」,后来不知怎的转向了「喜马拉雅」,一听就是三年。上班的时候听房产,买房了以后听装修,兴之所至时听旅行,分手后听亲密关系,...

原创小博客
今天
3
0
大数据教程(9.6)map端join实现

上一篇文章讲了mapreduce配合实现join,本节博主将讲述在map端的join实现; 一、需求 实现两个“表”的join操作,其中一个表数据量小,一个表很大,这种场景在实际中非常常见,比如“订单日志...

em_aaron
今天
3
0
cookie与session详解

session与cookie是什么? session与cookie属于一种会话控制技术.常用在身份识别,登录验证,数据传输等.举个例子,就像我们去超市买东西结账的时候,我们要拿出我们的会员卡才会获取优惠.这时...

士兵7
今天
3
0
十万个为什么之为什么大家都说dubbo

Dubbo是什么? 使用背景 dubbo为什么这么流行, 为什么大家都这么喜欢用dubbo; 通过了解分布式开发了解到, 为适应访问量暴增,业务拆分后, 子应用部署在多台服务器上,而多台服务器通过可以通过d...

尾生
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部