C语言--结构体大小

在这里插入图片描述

基本数据类型占用的字节数分别为:char(1),short(2),int(4),long(4),long long(8),float(4),double(8)。
分析一下下面结构体占用的字节数。

struct A
{
int a;
};
struct B
{
char a;
int b;
};
int main()
{
printf("sizeof(struct A)=%d\n", sizeof(struct A));//测试A的大小
printf("sizeof(struct B)=%d\n", sizeof(struct B));//测试B的大小
return 0;
}

在这里插入图片描述
struct A的大小好理解,int a的大小为4字节。
struct B的大小为什么是8字节,而不是1+4,5字节呢?
出于性能考虑,数据应该尽可能地在自然边界上对齐”。这句话是什么意思呢?看下图,假设地址从100
开始
在这里插入图片描述
在上图的(一)中,a,b内存紧密相连,其内存加起来是5个字节,但是b的地址为101不能被4整除(4是b的
类型大小)。读取b的数据时需要转换,速度较慢。
在上图的(二)中,a,b中间有三个字节的空间不使用,b的地址为104能被4整除,读取b的数据时不需要转
换,速度快。但这时的空间为1+3+4=8字节。
现代计算机的内存都是比较大的,操作系统在设计时都愿意浪费一点点空间来换取更快的速度

对齐规则1

对齐规则1:当前成员所在的地址能整除成员本身的字节大小。
也就是说,char类型成员的地址要能被1整除,short类型成员的地址要能被2整除,int类型成员的地址要
能被4整除,其它数据类型同理。
再练习几个,看看它们的大小是几个字节呢?

在这里插入图片描述
答案分别是8,16,12。

在这里插入图片描述
上图中”+”后面的数字为内存对齐不使用的字节数。
下面这个结构体占用几个字节呢

struct E
{
int a;
char b;
};

它的大小应该是5(4+1)字节,但是实际上它的大小却是8字节,这是为什么呢?
规则:

对齐规则2

对齐规则2:==结构体的总大小能整除单个最大成员的字节数。 ==
上面的例子, struct E占用字节数5不能整除最大成员a的字节数4(5不能整除4),所以struct E占用的字
节数应该对齐为4的倍数,8字节。
对齐规则2又是怎么来的呢?为什么有这样的规定?请看下面的分析。

struct E
{
int a;
char b;
};
int main()
{
struct E arr[2]; //结构体数组
return 0;
}

结构体不仅可以定义单个变量,也可以定义数组,如上struct E arr[2];那么arr数组的内存如何分布呢?
在这里插入图片描述
如上图(一)所示,如果struct E占用5字节,数组arr[0]成员a,b的地址都可以被本身大小整除,但是
arr[1]。a的地址为105不能被4整除。
如上图(二)所示,如果struct E占用8节字,那么arr[0],arr[1]的成员地址都可以被本身大小整除。


本篇完!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/614861.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抽象的算法0.1.1版本

前言:在0.1版本中,我们得到了可迭代的超级模板,问题简单化 最近看到一本十分厉害的电子书,其中两句话让我虎躯一震,这就是大佬的思维! 第一句话:数学是用来描述万物本质的语言,是理…

Comparablae接口

在日常生经常涉及到排序的的问题,排序问题中又不得不涉及到比较的问题。在排序问题中根据不同的规则对多个对象进行比较,然后根据比较内容的不同对对象进行排序。java中的Comparable就是用来定义排序规则的接口。当要对类中的对象进行排序操作时&#xf…

MYSQL5.7详细安装步骤

MYSQL5.7详细安装步骤: 0、更换yum源 1、打开 mirrors.aliyun.com,选择centos的系统,点击帮助 2、执行命令:yum install wget -y 3、改变某些文件的名称 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base…

C语言 | Leetcode C语言题解之第26题删除有序数组中的重复项

题目&#xff1a; 题解&#xff1a; int removeDuplicates(int* nums, int numsSize) {if (numsSize 0) {return 0;}int fast 1, slow 1;while (fast < numsSize) {if (nums[fast] ! nums[fast - 1]) {nums[slow] nums[fast];slow;}fast;}return slow; }

能看会说的人形机器人,对话的样子吓到我了

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 还记得这个表情宛如真人的人形机器人吗&#xff1f; ta被取名Ameca&#xff0c;由一家名为「…

模板方法模式:定义算法骨架的设计策略

在软件开发中&#xff0c;模板方法模式是一种行为型设计模式&#xff0c;它在父类中定义一个操作的算法框架&#xff0c;允许子类在不改变算法结构的情况下重定义算法的某些步骤。这种模式是基于继承的基本原则&#xff0c;通过抽象类达到代码复用的目的。本文将详细介绍模板方…

二维数组---刷题

一维数组不想更了&#xff0c;弄点二维数组&#xff01; 1.对角线 已知一个6*6的矩阵&#xff0c;把矩阵两条对角线上的元素加上10&#xff0c;然后输出这个新矩阵。 思路 题目简单&#xff0c;6*636&#xff0c;可以得知有36个元素。数组就定义成a[7][7]&#xff0c;难点在与…

[大模型]Yi-6B-Chat 接入 LangChain 搭建知识库助手

Yi-6B-Chat 接入 LangChain 搭建知识库助手 环境准备 在 autodl 平台中租赁一个 3090 等 24G 显存的显卡机器&#xff0c;如下图所示镜像选择 PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8 接下来打开刚刚租用服务器的 JupyterLab&#xff0c;并且打开其中的终端开始…

Python编写一个抽奖小程序,新手入门案例,简单易上手!

“ 本篇文章将以简明易懂的方式引导小白通过Python编写一个简单的抽奖小程序&#xff0c;无需太多的编程经验。通过本文&#xff0c;将学习如何使用Python内置的随机模块实现随机抽奖&#xff0c;以及如何利用列表等基本数据结构来管理和操作参与抽奖的人员名单。无论你是Pytho…

私有化即时通讯软件,WorkPlus提供的私有化、安全通讯解决方案

在当今信息化快速发展的时代&#xff0c;安全问题已经成为各行各业关注的焦点。特别是在金融、政府单位和芯片等关键行业&#xff0c;信息安全的重要性不言而喻。这些行业涉及到大量的敏感数据和关键信息&#xff0c;一旦发生泄露&#xff0c;可能会对国家安全、企业利益甚至个…

Django中的静态文件、路径、访问静态文件的方法

1.什么是静态文件 不能与服务器端做动态交互的文件都是静态文件 如:图片,css,js,音频,视频,html文件(部分) 2.静态文件配置 在 settings.py 中配置一下两项内容: 1.配置静态文件的访问路径 通过哪个url地址找静态文件 STATIC_URL ‘/static/’ 说…

跟TED演讲学英文:Why AI will spark exponential economic growth by Cathie Wood

TED英文文稿 文章目录 TED英文文稿Why AI will spark exponential economic growthIntroductionVocabularyTranscriptSummary后记 Why AI will spark exponential economic growth Link: https://www.ted.com/talks/cathie_wood_why_ai_will_spark_exponential_economic_growth…