文档章节

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

zhaoWSW
 zhaoWSW
发布于 2017/09/03 22:14
字数 1084
阅读 9
收藏 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++区别 这是C++教程得第一步,后续会持续更新哦!欢迎新手(具有C基础),老鸟可绕道,可指导。 C++标准输入和输出 C++标准输入和输出分别是cin和cout,用法非常简单 cin>>n...

这个人很懒什么都没留下
09/01
0
0
计算机专业C语言编程学习重点:指针化难为易

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

小辰带你看世界
05/31
0
0
C++11 中值得关注的几大变化

源文章来自前C++标准委员会的 Danny Kalev 的 The Biggest Changes in C++11 (and Why You Should Care),赖勇浩做了一个中文翻译在这里。所以,我就不翻译了,我在这里仅对文中提到的这些变...

雅各宾
2014/01/17
0
0
extern "C"的用法解析

extern "C"的用法解析 http://blog.sina.com.cn/u/494a1ebc010004g5 C++中extern “C”含义深层探索 1.引言 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和...

西昆仑
2011/12/23
0
0
5-C++远征之离港篇-学习笔记

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

天涯明月笙
07/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Shiro | 实现权限验证完整版

写在前面的话 提及权限,就会想到安全,是一个十分棘手的话题。这里只是作为学校Shiro的一个记录,而不是,权限就应该这样设计之类的。 Shiro框架 1、Shiro是基于Apache开源的强大灵活的开源...

冯文议
今天
1
0
linux 系统的运行级别

运行级别 运行级别 | 含义 0 关机 1 单用户模式,可以想象为windows 的安全模式,主要用于修复系统 2 不完全的命令模式,不含NFS服务 3 完全的命令行模式,就是标准的字符界面 4 系统保留 5 ...

Linux学习笔记
今天
2
0
学习设计模式——命令模式

任何模式的出现,都是为了解决一些特定的场景的耦合问题,以达到对修改封闭,对扩展开放的效果。命令模式也不例外: 命令模式是为了解决命令的请求者和命令的实现者之间的耦合关系。 解决了这...

江左煤郎
今天
3
0
字典树收集(非线程安全,后续做线程安全改进)

将500W个单词放进一个数据结构进行存储,然后进行快速比对,判断一个单词是不是这个500W单词之中的;来了一个单词前缀,给出500w个单词中有多少个单词是该前缀. 1、这个需求首先需要设计好数据结...

算法之名
昨天
15
0
GRASP设计模式

此文参考了这篇博客,建议读者阅读原文。 面向对象(Object-Oriented,OO)是当下软件开发的主流方法。在OO分析与设计中,我们首先从问题领域中抽象出领域模型,在领域模型中以适当的粒度归纳...

克虏伯
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部