struct结构体大小的计算(内存对齐)

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 }
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » struct结构体大小的计算(内存对齐)