内存对齐规则

news2024/11/28 4:45:00

前言

        求结构体的大小是很热门的考点,无论你是学C还是C++,都会遇到这样的问题,在面试中也很受欢迎,所以我们先思考这样一个问题:计算结构体,联合体和类的大小应该怎么去计算呢?我们知道,在C语言中结构体内部可以包含很多变量,所以我们在没有学习这个知识之前,会固化地认为,结构体的大小就是内部变量的大小的总和,但是事实就是这样吗?显然并不是,那接下来我们就要去学习一下如何求结构体它们的大小

一、内存对齐规则(每一个都是重点

1. 第一个成员永远在与结构体变量偏移量为0的地址处。

2. 其他成员变量要对齐到 自身对齐数的整数倍 的地址处。

对齐数 = 编译器默认的一个对齐数该成员大小较小值

只有VS中默认对齐数值为8
其他编辑器(gcc,clang)的对齐数就是成员自身的大小

3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍

4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

5. 当结构体里有数组的时候,我们数组的对齐数是数组中一个元素的大小,之后在占整个数组大小的空间。

5. 使用下面的代码可以设置默认对齐数:

#include <stdio.h>
#pragma pack(8)//设置默认对齐数为8
struct S1
{
    char c1;
    int i;
    char c2;
};
#pragma pack()//取消设置的默认对齐数,还原为默认

二、求结构体大小的例题 (都按编辑器没有默认对齐数)

1. 例题1

#include <stdio.h>
struct S1
{
    char c1;
    int i;
    char c2;
};
int main()
{
    printf("%lu",sizeof(struct S1));
    return 0;
}

答案及解析 12

2. 例题2

#include <stdio.h>
struct S2
{
    char c1;
    char c2;
    int i;
};
int main()
{
    printf("%lu\n", sizeof(struct S2));
    return 0;
}

答案及解析 8

153. 例题3

#include <stdio.h>
struct S3
{
    double d;
    char c;
    int i;
};
int main()
{
    printf("%lu\n", sizeof(struct S3));
    return 0;
}

答案及解析 16

4. 例题4 (嵌套结构体)

#include <stdio.h>
struct S3
{
    double d;
    char c;
    int i;
};

struct S4
{
    char c1;
    struct S3 s3;
    double d;
};
int main()
{
    printf("%lu\n", sizeof(struct S4));
    return 0;
}

答案及解析 32

5. 例题5(结构体内部有数组)

#include <stdio.h>
struct S1
{
    char c1;
    int arr[6];
};
int main()
{
    printf("%lu",sizeof(struct S1));
    return 0;
}

答案及解析 28

三、联合体的计算规则

联合体是共用同一块空间的;

1. 联合的大小至少是最大成员的大小

2. 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍

3. 数组的对齐数是数组的一个元素的大小,再占整个数组大小的空间。

四、求union联合体大小的例题

1. 例题1


#include <stdio.h>
union Un1
{
    char c[5];
    int i;
};

int main()
{
    printf("%lu\n", sizeof(union Un1));
    return 0;
}

答案及解析  8

2. 例题2

#include <stdio.h>
union Un2
{
    short c[7];
    int i;
};
int main()
{
    printf("%lu\n", sizeof(union Un2));    
    return 0;
}

答案及解析 16

五、求类大小(向结构体看齐,一样的规则哦)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

105.am40刷机(linux)折腾记1-前期的准备工作1

前段时间在某鱼上逛的时候&#xff0c;发现一款3399的盒子只要150大洋&#xff0c;内心就开始澎拜&#xff0c;一激动就下手了3台&#xff0c;花了450大洋&#xff08;现在想想&#xff0c;心都碎了一地&#xff09;。 然后自己又来来回回折腾了几天&#xff0c;目前能跑上fire…

C# 异步日志记录类,方便下次使用,不用重复造轮子

先定义接口类&#xff1a; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 异常 {internal interface ILog{Task WriteErrorLog(string message);Task WriteInfoLog(string message);Task W…

高级运维学习(十四)Zabbix监控(一)

一 监控概述 1 监控的目的 &#xff08;1&#xff09;报告系统运行状况 每一部分必须同时监控内容包括吞吐量、反应时间、使用率等 &#xff08;2&#xff09;提前发现问题 进行服务器性能调整前&#xff0c;知道调整什么找出系统的瓶颈在什么地方 2 监控的资源类别 …

钉钉API与集简云无代码开发连接:电商平台与营销系统的自动化集成

连接科技与能源&#xff1a;钉钉API与集简云的一次集成尝试 在数字化时代&#xff0c;许多公司面临着如何将传统的工作方式转变为更智能、高效的挑战。某能源科技有限公司也不例外&#xff0c;他们是一家专注于能源科技领域的公司&#xff0c;产品包括节能灯具、光伏逆变器、电…

Flink之SQL客户端与DDL操作

SQL客户端与DDL操作 Flink SQLSQL客户端1.启动Flink2.启动Flink的SQL客户端3.HELP命令4.验证连接5.结果显示模式6.执行配置 数据库操作1.创建数据库2.查询数据库3.修改数据库4.删除数据库 表操作1.创建表表列属性表Watermark属性列PRIMARY KEY属性列PARTITIONED BY属性列WITH选…

真是性价比之王,腾讯云这款88元云服务器已经圈粉无数!

你是否曾经想过拥有一台属于自己的云服务器&#xff0c;但是却被高昂的价格和复杂的配置吓到了&#xff1f;现在&#xff0c;腾讯云推出了一款价格亲民、简单易用的88元云服务器&#xff0c;让你的梦想成为现实。腾讯云88元/年云服务器配置见下图&#xff1a; 腾讯云88元服务器…

大厂面试题-行锁、临键锁、间隙锁的理解

行锁、临键锁、间隙锁&#xff0c;都是MySQL里面InnoDB引擎下解决事务隔离性的一系列排他锁。 分别介绍一下这三种锁&#xff1a; 1、行锁&#xff0c;也称为记录锁。(如图) 当我们针对主键或者唯一索引加锁的时候&#xff0c;MySQL默认会对查询的这一行数据加行锁&#xff…

视频剪辑方法:为视频剪辑添加亮点,如何制作精美的滚动字幕

在视频剪辑中&#xff0c;滚动字幕是一个重要的元素&#xff0c;它可以为视频增添视觉吸引力&#xff0c;增强观看体验。滚动字幕的长度和速度也是非常重要的因素。如果滚动字幕太长&#xff0c;会让人感到拖沓&#xff1b;如果滚动字幕太短&#xff0c;会让人感到匆忙。因此&a…

Java设计模式-创建者模式-工厂模式

工厂模式 工厂模式简单工厂模式工厂方法模式抽象工厂模式 工厂模式 要求&#xff1a;由一个特定的工厂提供所需的对象&#xff0c;由工厂来完成对象的创建 工厂模式一般分为三种&#xff1a;简单工厂模式&#xff0c;工厂方法模式&#xff0c;抽象工厂模式 其中简单工厂模式不…

第三方支付支付宝的信息安全分析

随着信息技术的进步&#xff0c;网络结算方式也在迅速发展。网上结算虽然便捷快速&#xff0c;但是如果没有保障的平台或者法律的支持&#xff0c;双方在没有约束的情况下&#xff0c;就会导致拖延、折扣或者拒付等许多经济事件的发生&#xff0c;由此第三方支付就随之产生。第…

三目运算符与if 判断语句的区别

我们用一个案例解释python的判断语句&#xff1a; if a > b &#xff1a;return aelse&#xff1a;return b案例&#xff1a; a 2b 3if a > b:max aelse:max b这样利用python语言&#xff0c;写一个if 判断没有问题吧 三目运算符 下面我们用三目运算符来完成这样一…

Win10专业版安装wsl-ubuntu子系统

文章目录 一、查看是否满足安装要求二、管理员权限启动 Windows PowerShell三、启用Windows10子系统功能四、启用虚拟机平台功能五、重启电脑六、下载 Linux 内核更新包&#xff08;适用于 x64 计算机的 WSL2 Linux 内核更新包&#xff09;七、将 WSL 2 设置为默认版本八、打开…

台灯护眼灯哪个牌子好?护眼台灯品牌型号推荐榜单

台灯可以说家家必备&#xff01;家中有上学的小孩更是需要一款好台灯&#xff0c;因为看书、写字、做作业都离不开台灯&#xff0c;一款好的台灯不仅会提供明亮的学习环境&#xff0c;而且还能保护视力&#xff0c;预防近视&#xff0c;因此&#xff0c;挑选台灯绝对不可以马虎…

React Native适配Xcode 15 iOS 17.0+

iOS 17.0 Simulator(21A328)下载失败 App Store 更新到 Xcode15 后&#xff0c;无法运行模拟器和真机。需要下载iOS 17对应的模拟器。Xcode中更新非常容易中断失败&#xff0c;可以在官网单独下载iOS 17模拟器文件&#xff0c;例如&#xff1a;iOS_17.0.1_Simulator_Runtime.d…

React 递归手写流程图展示树形数据

需求 根据树的数据结构画出流程图展示&#xff0c;支持新增前一级、后一级、同级以及删除功能&#xff08;便于标记节点&#xff0c;把节点数据当作label展示出来了&#xff0c;实际业务中跟据情况处理&#xff09; 文件结构 初始数据 [{"ticketTemplateCode": &…

Vite - 配置 - 不同的环境执行不同的配置文件

目标描述 通过不同的命令&#xff0c;执行不同的环境的配置文件中的内容&#xff1a; npm run dev : 执行开发环境的配置文件 npm run build: 执行生产环境的配置文件 环境文件准备 为了在不同的环境中使用不同的配置文件&#xff0c;我们将配置文件拆分开来。 开发环境使用开发…

【Python基础】基于UPD协议实现简易聊天室(Socket编程)

UDP通信 1.什么是 socket2. 创建 socket3.udp 网络程序-发送、接收数据&#xff08;User Datagram Protocol&#xff09;udp 网络程序-发送、接收数据&#xff08;客户端&#xff09;udp 绑定信息udp 绑定信息---服务器端总结 4.udp 聊天器 1.什么是 socket socket(简称 套接字…

如何快速编写测试用例?

当你学会了如何设计测试用例之后&#xff0c;接下来便是开始用例的编写。 在设计阶段&#xff0c;更准确的说应该是识别测试点的过程&#xff0c;而编写阶段则是将测试点细化成一条条测试用例的过程&#xff0c;有了比较全的用例场景后&#xff0c;如何让别人更舒服、更方便、…

Python + UnitTest 软件测试流程总结

以测试用户登录流程为例&#xff1a; TestCase&#xff1a; TestCase 主要用来编写测试用例&#xff0c;这里结合 断言&#xff08;assertEqual 和 assertIn&#xff09; 进行判断&#xff0c;避免了手动书写判断。 # tools.py # 登录验证方法 def login(username, password…

Android Studio导入,删除第三方库

Android项目经常用到无私的程序员们提供的第三方类库。本篇博客就是实现第三方库的导入和删除。 一、导入第三方库 1、将需要的库下载到本地&#xff1b; 2、新建Moudle (1)File --- New Moudle (2)选择Android Library --- Next (3)填写Moudle名 --- Finish。一个新的Mou…