文档章节

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

zhaoWSW
 zhaoWSW
发布于 2017/09/03 22:14
字数 1084
阅读 6
收藏 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
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
C++11 中值得关注的几大变化

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

雅各宾
2014/01/17
0
0
C语言编程学习程序解析:C语言的指针和函数返回值解析

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

小辰带你看世界
05/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

@SpringBootApplication 注解

@SpringBootApplication注解是一个组合注解,包含以下注解 @Target(ElementType.TYPE) 注解的作用目标 @Retention(RetentionPolicy.RUNTIME) Reteniton的作用是定义被它所注解的注解保留多久,...

java.刘
38分钟前
0
0
sentinel自定义DataSource实战

序 本文主要研究一下如何自定义sentinel的DataSource,这里以jdbc为例。 maven <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sen......

go4it
54分钟前
1
0
xgboost/gbdt在调参时为什么树的深度很少就能达到很高的精度?

问题: 用xgboost/gbdt在在调参的时候把树的最大深度调成6就有很高的精度了。但是用DecisionTree/RandomForest的时候需要把树的深度调到15或更高。用RandomForest所需要的树的深度和Decisio...

tantexian
55分钟前
0
0
php-fpm的pool - 慢执行日志 - 进程管理 - open_basedir

php-fpm的pool : 为避免多站点使用同一个pool时因一个站点故障导致php资源耗尽,牵连使用同一个pool的其他站点的正常工作,可对每一个站点设置独立pool。 增加pool: 1.编辑php-fpm配置文件...

ZHENG-JY
今天
0
0
Linux之ssh服务默认端口修改

导读 SSH是标准的网络协议,可用于大多数UNIX操作系统,能够实现字符界面的远程登录管理,它默认使用22号端口,采用密文的形式在网络中传输数据,相对于通过明文传输的Telnet,具有更高的安全...

问题终结者
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部