c语言嵌套结构体内存对齐

2023-05-16

结构体内存对齐规则:
1.第一个成员在结构体变量偏移量为0 的地址处。
2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数 = 编译器默认的一个对齐数与该成员大小中的较小值。vs中默认值是8 Linux默认值为4(也有说法说linux中没有默认).
3.结构体总大小为最大对齐数的整数倍。(每个成员变量都有自己的对齐数)
4.如果嵌套结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(包含嵌套结构体的对齐数)的整数倍。

struct S3 {
	double d;
	char c;
	int i;

};

struct S4 {
	int f;
	char c;
	struct S3 s3;


};
int main() {
	//struct S3 s3 = {20.1,'a',4};
	//struct S4 s4 = { 'b',s3,0xffffffff };

	struct S3 s3 ;
	struct S4 s4 ;

	printf("%d\n", sizeof(s4));

	return 0;
}

这里已知s3是16字节
以上s4的大小是24,首先int类型4个字节;char类型1个字节;s3是16个字节与vs编译器8相比较大,s3的最大对齐数就是8而不是16(第二条);这样就从偏移量8的位置开始添加,前面空余3个字节,这样总字节数为4+1+3+16=24,而最大的对齐数为s3的对齐数8,24也是8的整数倍(第三条第四条)。输出24、

struct S3 {
	double d;
	char c;
	int i;

};

struct S4 {

	char c;
	struct S3 s3;
	int f;

};
int main() {
	//struct S3 s3 = {20.1,'a',4};
	//struct S4 s4 = { 'b',s3,0xffffffff };

	struct S3 s3 ;
	struct S4 s4 ;

	printf("%d\n", sizeof(s4));

	return 0;
}

上方代码与前文代码在S4中int f的位置发生了变化。故及算法方式为1+7+16+4=28。而最大的对齐数为8(s3的),而28不是8的倍数。距离最近的8的倍数是32.故此结果是32。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c语言嵌套结构体内存对齐 的相关文章

随机推荐

  • kvm启动虚拟机流程

    启动虚拟机 virDomainCreate 0 virDomainCreate domain 61 0x697990 at libvirt c 8133 1 0x000000000042261f in cmdStart ctl 61 0x7
  • webpack使用(4)之引入第三方JS库

    一 script引入第三方库lodash 不建议使用 span class hljs tag lt span class hljs title script span span class hljs attribute src span 6
  • 如何打包自己的NerdFont

    前言 众所周知 xff0c 在使用Poweshell的美化工具oh my posh的时候都是需要特定字体支持的 xff0c 否则就会因为一些图标无法显示而出现乱码 xff0c 常用的字体自然是NerdFont系列字体 xff0c 但有时也会
  • SQL Server存储过程事物控制(为一个折腾好久的异常记录)

    USE DBName GO SET ANSI NULLS ON GO SET QUOTED IDENTIFIER ON GO ALTER PROC dbo CreateDept 64 Name NVARCHAR 100 61 N 39 39
  • Java设计模式之行为型:观察者模式

    一 什么是观察者模式 xff1a 观察者模式又称为 发布 订阅模式 xff0c 定义了对象之间一对多依赖关系 xff0c 当目标对象 被观察者 的状态发生改变时 xff0c 它的所有依赖者 观察者 都会收到通知 一个观察目标可以对应多个观察
  • AAC编码原理

    AAC编码原理 转自 xff1a http www hellotongtong com avcodecbase avcodecbase aaccodec intro html 一 AAC编码概述 AAC是高级音频编码 xff08 Advan
  • FFmpeg入门详解之19:音视频封装原理简介

    什么是数据封装和解封装 数据封装 xff08 baiData Encapsulation xff09 xff0c 笼统地讲 xff0c 就是把业务数据映射到du某个封装协议zhi的净dao荷中 xff0c 然后填充对应协议的包头 xff0c
  • FFmpeg入门详解之35:FFplay播放器

    ffplay的初体验及快捷键 ffplay是ffmpeg工程中提供的播放器 xff0c 功能相当的强大 xff0c 凡是ffmpeg支持的视音频格式它基本上都支持 甚至连VLC不支持的一些流媒体都可以播放 xff08 比如说RTMP xff
  • 达梦数据库入门:管理实例(Linux)

    达梦数据库管理实例 xff08 Linux xff09 1 xff1a 创建数据库实例 一 使用数据库助手 xff08 GUI xff09 创建数据库实例 xff08 安装用户 xff1a dmdba 安装路径 dm8 xff09 1 登录
  • Win11 WSL2 启用 systemd 及设置静态 / 固定 IP

    一 以管理员身份打开 Windows 终端 默认情况下 xff0c 鼠标右击桌面弹出的快捷菜单上有一项 在终端中打开 xff0c 点击它后就会启动 Windows 终端 此时的终端并不是以管理员身份运行的 点击 Windows 终端标题栏上
  • VSCode点击“Open In Default Browser”提示错误信息“Open browser failed!! ...”

    运行html文件点击 Open In Default Browser 时 xff0c 提示报错信息 Open browser failed Please check if you have installed the browser chr
  • 用VScode运行Vue项目(node.js环境的配置,如何以管理员身份运行cmd)

    用VScode运行Vue项目详细全过程 xff08 node js环境的配置 xff09 D gloria的博客 CSDN博客 基本按上面博主的步骤来的 xff0c 只是中间一些步骤记一下笔记 上面文章中运行cmd时 xff0c 要根据博主
  • 全世界最强的算法平台codeforces究竟有什么魅力?

    大家好 xff0c 之前说过由于和LeetCode结了梁子 xff0c 所以周末的LeetCode专题取消了 xff0c 给大家写点其他专题的算法问题 目前选择的是国外著名的编程竞赛平台 codeforces 它在竞赛圈名气比较大 xff0
  • 四步利用docker搭建samba服务器

    我的系统是centos7 打算共享 home目录供windows用故快速利用docker搭建samba服务 本教程利用dperson samba镜像作为容器 xff1a 步骤 xff1a 第一步 xff1a yum span class h
  • 2-6 链表逆序及其C++实现

    更多系列博文请点击 xff1a 0 数据结构与算法链接目录 2 6 链表逆序 我只介绍两种常用方法吧 xff0c 非递归方法 和 递归 方法 我觉得够用就行 1 非递归方法 xff1a 将第二个元素后面的元素依次插入到头结点后面 xff0c
  • SQL Server 通过SQL生成Java代码 (为了省事写的生成实体类中属性)

    SELECT 字段名 61 a name 类型 61 b name 字段说明 61 isnull g value 39 39 CONVERT VARCHAR 100 a name AS colname CONVERT VARCHAR 100
  • C++编译器VS2019和MinGW的问题

    C 43 43 编译器VS2019和MinGW的问题 xff1a 最近在啃C 43 43 Primer这本书 xff0c 在学习到第14章重载运算符时 xff0c 准备为自定义的类String重载一个输入运算符 gt gt xff0c 代码
  • 物理机debian环境搭建

    装系统全程ob腾哥配置 xff0c 记录一下 1 首先需要一个刻录u盘 xff0c 格式化 2 下载u盘刻录软件 xff0c refus 3 到镜像站或官网下载debian iso 4 插入u盘 xff0c 进行刻录 5 到电脑插入u盘 x
  • PYTHON简单代码去除TXT文档重复行内容去重复

    PYTHON简单代码去除TXT文档重复行内容去重复 fi span class token operator 61 span span class token builtin open span span class token punct
  • c语言嵌套结构体内存对齐

    结构体内存对齐规则 xff1a 1 第一个成员在结构体变量偏移量为0 的地址处 2 其他成员变量要对齐到某个数字 xff08 对齐数 xff09 的整数倍的地址处 对齐数 61 编译器默认的一个对齐数与该成员大小中的较小值 vs中默认值是8