本文已参与「新人创作礼」活动,一起开启掘金创作之路。
这篇文章介绍数据类型在内存中是如何体现的。
数据存储
数据大小的不同:
在内存上的体现:
既然是连续的地址空间,就有很多不同的访问方式,比方对于 int val[5] 来说
多维数组
对于多维的数组,基本形式是 T A[R][C],R 是行,C 是列,如果类型 T 占 K 个字节的话,那么数组所需要的内存是 R*C*K 字节。
多维数组在内存中,是这样存放的:
对齐
对于图中的结构体,它包含两个int类型的变量和一个char类型的变量。
根据前面的知识,我们会直观的认为该结构体占用9个字节的存储空间
但是当使用sizeof函数对该结构体的大小进行求值时,得到的结果却是12个字节。
原因是为了提高内存系统的性能,系统对于数据存储的合法地址做出了一些限制 (对齐) 。
因此,编译器会在结构体的末端增加3个字节的填充,这样一来,所有的对齐限制都满足了。
对于不同的数据类型,地址对齐的原则是任何K字节的基本对象的地址必须是K的倍数。
悟出两个道理:
- 结构体中数据类型的声明顺序都会影响实际内存分配的大小,而这一点,不学汇编的人是不知道的。
- 根据这种特点,在设计结构体的时候要把大的数据类型放到前面。
联合体:
联合( union),用关键字 union来声明,允许用几种不同的类型来引用一个对象。
其结构的内存大小取决于最大的数据类型。