struct结构体大小的计算(内存对齐)
本次实验环境
环境1:Win10, QT 5.12
一. 背景
当普通的类型无法满足我们的需求的时候,就需要用到结构体了。结构体可衍生出结构体数组,结构体还可以嵌套结构体,这下子数据类型就丰富多彩了,我们可以根据需要定义自己的数据类型。有时需要求结构体的大小,这就涉及到内存对齐的知识。概念、理论之类,我没有深入研究,这里主要是验证一下计算结构体大小的方法,证明学习到的方法确实有效。关于内存对齐,最开始是看了《深入理解计算机系统》中关于“数据对齐”一节,上面轻描淡写的写了下求结构体的大小,我没看明白。看《零基础入门C语言》中关于计算结构体大小的规则,算是看明白了。
二. 前奏
先说点我觉得有意思的地方。数组之间是不可以直接赋值的,但是用结构体包装一下,就达到了这个效果,前者无法做到的事情却通过结构体做到了。通过代码来验证一下。
定义了两个数组arr和arr2,第14行代码,将arr赋值给arr2,编译时会报错。提示:14: error: array type “int [5]” is not assignable。
(数组名有二义性,一是表示数组名,相当于数组的定海神针,二是表示首元素的地址。第14行代码把一个数组的首元素的地址赋值给另一个数组首元素,显然这是不允许的)
将第14行代码注释后。定义了一个结构体,里面定义了一个整型数组。然后定义了两个结构体变量tt1和tt2,将tt2赋值给了tt1,然后打印变量tt2中数组里面的每个元素。
1 #include <iostream> 2 3 using namespace std; 4 5 struct numArr 6 { 7 int m_arr[5]; 8 }; 9 10 int main() 11 { 12 int arr[5] = {1, 2, 3, 4, 5}; 13 int arr2[5] = {0}; 14 // arr2 = arr; 15 16 struct numArr tt1 = {{1, 2, 3, 4, 5}}; 17 struct numArr tt2 = {{0}}; 18 tt2 = tt1; 19 20 for(int i = 0; i < 5; ++i) 21 { 22 cout<<tt2.m_arr[i]<<endl; 23 } 24 25 26 27 return 0; 28 }