当前位置:萝卜系统 > 硬件软件教程 > 详细页面

用于计算结构尺寸的Sizeof规则

用于计算结构尺寸的Sizeof规则

更新时间:2023-06-20 文章作者:未知 信息来源:网络 阅读次数:

根据运行的环境,操作系统可以分为桌面操作系统,手机操作系统,服务器操作系统,嵌入式操作系统等。

数组大小 sizeof_大小结构_sizeof计算结构体大小

结构的大小

(前一部分可获得,后一部分应嵌入

该结构的解释不详细,可以使用

供参考)

运算符sizeof可以计算给定类型的大小. 对于32位系统,

sizeof(char)= 1; sizeof(int)= 4.

基本数据类型的大小易于计算,让我们看一下如何计算结构化数据类型的大小.

C语言中有三种类型的结构数据: 数组,结构和联合.

数组是相同类型元素的集合. 只要计算出单个元素的大小,整个数组所占用的空间就等于基数

将基本元素的大小乘以元素数.

结构中的成员可以是不同的数据类型,并且成员按照定义的顺序存储在连续的内存中

空格. 与数组不同,结构的大小不仅仅是所有成员大小的总和. 需要考虑的是系统在

存储结构变量时的地址对齐问题. 看一下这样的结构:

struct stu1

{

int i;

字符c;

int j;

数组大小 sizeof_sizeof计算结构体大小_大小结构

};

首先介绍一个相关的概念偏移. 偏移量是指结构变量中成员的地址和结构更改

测量地址差. 结构的大小等于最后一个成员的偏移量加上最后一个成员的大小. 显然sizeof计算结构体大小,结构

body变量中第一个成员的地址是结构变量的第一个地址. 因此,第一个成员i的偏移量为0.

第二个成员c的偏移量是第一个成员的偏移量加上第一个成员的大小(0 + 4),其值为4;第一个

三个成员j的偏移量是第二个成员的偏移量加上第二个成员的大小(4 + 1),其值为5.

实际上,由于存储变量时地址对齐的要求,编译器在编译程序时将遵循两个原则:

1. 成员在结构变量中的偏移量必须是成员大小的整数倍(0被视为任何数字的整数倍)

2. 结构的大小必须是所有成员大小的整数倍.

与第一个成员相比,上例中前两个成员的偏移量满足要求,但第三个成员的偏移量为

5,不是其自身大小(int)的整数倍. 处理时,编译器将在第二个成员之后添加3个空字节,

使第三个成员的偏移量为8.

与第二个相比,该结构的大小等于最后一个成员的偏移量加上其大小,该大小在上例中计算得出

随附的大小为12,符合要求.

看一下满足第一项但不满足第二项的情况

struct stu2

{

int k;

数组大小 sizeof_sizeof计算结构体大小_大小结构

短t;

};

成员k的偏移量为0;成员t的偏移为4,因此不需要进行任何调整. 但是计算出的大小为6,显示为

但是,它不是成员k大小的整数倍. 因此,编译器将在成员t之后添加2个字节,以使结构更大

小的变成8,以满足第二个要求.

可以看出,定义结构类型时需要考虑字节对齐,不同的顺序会影响

结构的大小. 比较以下两个定义序列

struct stu3 struct stu4

{{

char c1;字符c1;

int i;字符c2;

char c2; int i;

}}

尽管结构stu3和stu4的成员相同,但是sizeof(struct stu3)的值为12,sizeof(structstu4)的值

的值

是8.

如何计算结构中的成员是否为另一种结构类型?看下面的例子,

结构体温度

大小结构_数组大小 sizeof_sizeof计算结构体大小

{

char a [5];

结构

{

int w;

双e;

int h;

} ss;

double d;

} tem;

只需扩展结构即可. 但是要注意的是,扩展结构的第一个成员(int w)

的偏移量

应该是要扩展的结构(ss所属的结构)中最大成员(双e)的整数倍.

解决方案如下:

第一个成员a [5]的偏移量为0. 第二个成员w的偏移量为第一个成员的偏移量加上第一个成员的偏移量

成员的大小(0 + 5),其值为5,不是(double e)大小的整数倍. 处理时,编译器将排在第三位

之后添加3个空字节

sizeof计算结构体大小_大小结构_数组大小 sizeof

成员,以使第三成员的偏移变为8. 第三成员e的偏移为第二

该成员的偏移量加上第二个成员的大小(8 + 4),该值为12. 第四个成员h的偏移量是第三个成员

成员的偏移量加上第三个成员的大小(12 + 8),值为20. 第五个成员d的偏移量是第一个成员

四个成员的偏移量加上第四个成员的大小(20 + 8),其值为28,而不是其自身大小(双倍d)

的整数倍

. 处理时,编译器将在第二个成员之后添加4个空字节,以便第三个成员的偏移量

成为32. 结构的大小等于最后一个成员的偏移量加上它的大小,在上面的示例中更大

小为40,符合要求. 此时,请注意,尽管char a [5]是5个字符的类型,但结构的大小是在末尾计算的.

计算1,即最终结构的大小可以被1整除,然后传递. (紫色部分是我自己的摘要).

请注意,在Linux下sizeof计算结构体大小,整个结构的大小应为:

Char对齐模数为1,短为2,int为4,浮点数为4,两倍(Linux为4,windows为8)

因此,对于以下结构: (32位计算机,默认设置)

结构体温度

{

int i;

double j;

};

在WINDOWNS系统下,整个结构的大小应为16,在LINUX系统下,整个结构的大小

大小应为12


本文来自本站,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-287415-1.html



温馨提示:喜欢本站的话,请收藏一下本站!

本类教程下载

系统下载排行

网站地图xml | 网站地图html