C/C++中基本数据类型所占内存大小
2017-09-11 17:49
337 查看
C/C++中基本数据类型所占内存大小
C中不同数据类型所占的字节大小,在不同的操作系统和编译器下,是不同的,一般主要说gcc下,32位或64位系统的,红色部分是32和64位系统不同的,做了个表如下:
数据类型 | 32位 | 64位 | 取值范围(32位) |
char | 1 | 1 | -128~127 |
unsigned char(当byte使用) | 1 | 1 | 0~255 |
short int /short | 2 | 2 | –32,768~32,767 |
unsigned short | 2 | 2 | 0~65,535 |
int | 4 | 4 | -2,147,483,648~2,147,483,647 |
unsigned int | 4 | 4 | 0~4,294,967,295 |
long int /long | 4 | 8 | –2,147,483,648~2,147,483,647 |
unsigned long | 4 | 8 | 0~4,294,967,295 |
long long int/long long | 8 | 8 | -9,223,372,036,854,775,808 ~9,223,372,036,854,775,807 |
指针 | 4 | 8 | |
float | 4 | 4 | 3.4E +/- 38 (7 digits) |
double | 8 | 8 | 1.7E +/- 308 (15 digits) |
1. 求数组大小时,如果数组作为参数传递时,退化为指针,所以sizeof(arr)大小为该系统下指针的大小
2. 对于C字符串,需要牢记C/C++中一个汉字占两个字节(Linux下3个字节)。
3. 求struct 或者 class 的大小时候,除了基本的数据类型大小,特别要考虑的是字节对齐问题,如果是C++的还涉及虚函数的虚表问题,需要加上虚表指针的大小,关于内存对齐的问题在别的博客会详细写。
关于数组,数组指针,指针数组稍微提一下:
关于sizeof求数组大小的,用代码去gcc中验证了下,说明下:
数组指针,本质是指向数组的指针,不管是指向什么类型,几维数组,sizeof返回的都是指针的大小;
只有正常创建数组 int arr[10],int arr[10][10],这样sizeof(arr)求的是数组的大小,如下图代码中,fun函数中,sizeof(a)的大小为指针的大小,数组作为参数退化为指针。
如下图可以看到,gcc会警告,sizeof只会返回一个int 指针的值
如下图代码中,类似
int(*p)[10]; //p是指向一维数组int [10]的指针
int*p[10]; //p是一维的指针数组,数组的每个元素是指针
结果如下:
这里解释下,因为是 64位系统,所以指针的大小是8,这里a,j 是数组指针,然后d,f分别是一维数组,二维数组的指针,g,h也是,下面解释一波他们的区别。只有b,c是指针数组。
这里我除了输出他们的内存大小,还有指针的值也就是他们指向的地址。
这里可以看到,a,b,c,,d,e,f他们的地址,都是19335XXX,可以看出他们是在一块内存中,这就是局部变量在栈区分配内存的,而g,h是b470XX, 因为malloc是动态分配的,是在堆区分配的,所以是另外一块内存。而且b,c的地址差值是240,差的就是b数组的大小。
顺便提一下,栈区是向下增长的,可以验证下(以下纯属个人兴趣,看不同类型数组在栈区的起始地址):
四个数组的地址是连续的,且b和arr是向下增长的。
在看这里,将最后的二维数组arr2改成一维数组后,arr2的地址是接在arr后面的(同类型是向上增长的),类型不一致后,另外起一段地址,是起低点的地址。
相关文章推荐
- C++中基本的数据类型和所占的内存大小
- iOS基本数据类型所占内存大小
- C/C++基本数据类型大小及表示范围
- C/C++学习之C提高----C程序数组排序、数据类型(大小,别名,封装)、变量、程序的内存四区模型(栈,堆,全局,代码区)
- C++ 基本语法之变量(指针)与数据类型(占用字节大小)
- Java中基本数据类型所占内存大小
- C/C++基本数据类型占用字节数及内存字节对齐
- 关于C和C++中的基本数据类型int、long、long long、float、double、char、string的大小及表示范围
- C和C++中的基本数据类型的大小及表示范围详解
- C/C++——基本数据类型的大小并且sizeof(int *) = 8
- C/C++中基本数据类型在内存中是如何存储的
- Java基本数据类型在内存中的存储大小实践
- 结构体内存对齐以及基本数据类型夸平台大小
- C++基本数据类型大小及表示范围
- C++里数据类型所占内存大小
- java 中基本数据类型在内存中占据的存储大小
- C++基本数据类型和内存映像(1)
- JAVA中基本数据类型所占内存空间大小
- Microsoft visual C++ 2010学习版中C语言基本数据类型所占字节大小(系统为64位win8.1)
- C/C++基本数据类型所占字节数及内存字节对齐