ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

关于结构体所占内存大小知识

2022-07-05 23:33:13  阅读:119  来源: 互联网

标签:变量 int 成员 知识 内存大小 偏移量 num1 体所 字节


关于结构体内存大小问题

我们首先要了解一个相关概念————偏移量。偏移量指的是结构体变量中成员的地址和结构体变量地址的差。结构体大小等于最后一个成员的偏移量加上最后一个成员的大小。

    struct book {
        int num1;
        char c1;
    }book1;

假定我们定义一个结构体book1,第一个成员变量num1,此时num1的偏移量为0(因为此刻的num1地址为该结构体所占内存空间的首地址,所以两者之间的差为0),此刻所使用的内存空间是(0+4)(偏移量+该变量的字节大小),第二个成员变量为c1,偏移量为前面变量的偏移量之和为4。而此时的通过sizeof输出的结果却不是5(4+1,偏移量+该变量的字节大),是为什么呢?

在实际中,存储变量时地址要求对齐,编译器在编译程序时会遵循两条原则:

  1. 结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)
  1. 结构体大小必须是所有成员大小的整数倍,也即所有成员大小的公倍数。

在我们刚才所定义的结构体book1中,我们所认为的结果是5,但是在该对齐规则中,5并不是int所占字节的倍数,因此会在变量c1后面补上3个字节的空间。

image

后面为补上的3个字节大小的空间。因此通过关键字sizeof输出的结果为8。

结构体成员不同的排序方式,导致的结构不同。

比如下面的代码:

#include<stdio.h>
struct book {
	int num1;
	char c1;
	char c2;	
}book1;
int main(int argc,char *argv[]){
	printf("%d",sizeof book1);
	return 0;
}

通过上面的偏移量概念和对齐规则我们得出的结果为8。第一个成员变量num1的偏移量为0,第二个成员变量c1的偏移量为4,第三个成员c2变量的偏移量为(4+1),最后所占内存大小等于c2偏移量加上c2的字节大小等于6(4+1+1),再按照对齐规则,该结构体成员变量中字节最大为int型,所以后面再补上2个字节为8,能被4整除。

#include<stdio.h>
struct book {
	char c1;
	int num1;
	char c2;	
}book1;
int main(int argc,char *argv[]){
	printf("%d",sizeof book1);
	return 0;
}

通过调换第一和第二个成员变量的顺序,我们发现通过关键字sizeof输出的数值大小为12。第一个成员变量c1的偏移量为0,第二个成员变量num1的偏移量大小为1,不同于上面的是此刻的偏移量1不是int型所占字节的倍数。
因此此刻要补上3个字节。所以第三个成员变量c2的偏移量为8,最后所占的大小是(1+4+3+1)9,9不是4的倍数,后面再补上3个字节大小,成为int型变量所占字节大小的倍数。

标签:变量,int,成员,知识,内存大小,偏移量,num1,体所,字节
来源: https://www.cnblogs.com/yuniyuyuan577/p/16449042.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有