当前位置: 首页 > news >正文

struct内存对齐

5.1.3 struct内存对齐

结构体的对齐规则:

(1)第一个成员在与结构体偏移量为0的地址处。

(2)其他成员变量要对齐到对齐数的整数倍的地址处

对齐数 = 编译器默认的对齐数与该成员大小的较小值。(vs中默认值为8)

(3)结构体总大小为最大对齐数的整数倍。

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

示例代码:

#include<stdio.h>
#include<stddef.h>struct S1
{char c1;int i;char c2;
};int main()
{printf("该结构体成员 c1 开始的位置为第 %d 个字节\n", offsetof(struct S1, c1));printf("该结构体成员 i 开始的位置为第 %d 个字节\n", offsetof(struct S1, i));printf("该结构体成员 c2 开始的位置为第 %d 个字节\n", offsetof(struct S1, c2));printf("该结构体所占的内存空间为 %d 个字节\n", sizeof(struct S1));return 0;
}
/**输出:
该结构体成员 c1 开始的位置为第 0 个字节
该结构体成员 i 开始的位置为第 4 个字节
该结构体成员 c2 开始的位置为第 8 个字节
该结构体所占的内存空间为 12 个字节*/

分析表格:

结构体变量成员变量自身所占大小编译器默认对齐数对齐数(较小值)
C1181
i484
C2181

示例代码2:

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

S3的最大对齐数为 8,它的大小为 16 个字节

首先,毋庸置疑的是 char 先放到首位

接下来因为S3的对齐数为 8,所以S3放在了以位置8开始的16个字节

最后是double,对齐数为8,所以放在了24的位置

最后,该结构体的大小为 4*8 = 32 个字节

http://www.lryc.cn/news/309527.html

相关文章:

  • 探索Redis 6.0的新特性
  • 关于CSS中定位的教程
  • 抽象类、模板方法模式
  • 消息队列kafka
  • 复盘成长——2024.2月复盘
  • Kafka安全模式之身份认证
  • 3、Redis-List【常用】
  • 黑马c++ STL部分 笔记(7) list容器
  • 关于使用Mxnet GPU版本运行DeepAR报错解决方案
  • 【STM32】江科大STM32学习笔记汇总(50)
  • LabVIEW非接触式电阻抗层析成像系统
  • 蓝桥杯备战刷题three(自用)
  • 密码学——二次剩余
  • 10.7、华为数通HCIP-DataCom H12-821单选题:121-140
  • 多租户篇 | MatrixOne与MySQL全面对比
  • python Matplotlib Tkinter-->导出pdf报表
  • react-组件基础
  • The authenticity of host ‘github.com (20.205.243.166)‘ can‘t be established.
  • arduino uno R3驱动直流减速电机(蓝牙控制)
  • 智能家居控制系统(51单片机)
  • 软考高级系统分析师之 URL 知识点和例题
  • vmware虚拟机centos中/dev/cl_server8/root 空间不够
  • C++/数据结构:AVL树
  • Mysql数据库_max_allowed_packet参数详解
  • 【数仓】Hadoop集群配置常用参数说明
  • 【go从入门到精通】什么是go?为什么要选择go?
  • MySQL篇—执行计划介绍(第二篇,总共三篇)
  • nest.js使用nest-winston日志一
  • LeetCode刷题笔记之二叉树(四)
  • 【MATLAB源码-第150期】基于matlab的开普勒优化算法(KOA)机器人栅格路径规划,输出做短路径图和适应度曲线。