1.结构体的内存对齐规则

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

2.其他成员变量都放在对齐数(成员的大小和默认对齐数的较小值)的整数倍的地址处。

对齐数=编译器默认的一个对齐数与该成员大小的较小值。(VS中默认的对齐数是8)

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

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

2.例子

1、例一

2、例二

3.为什么存在内存对齐

参考了大部分资料,大部分都这么说:

1.平台原因(移植问题): 不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

2.性能原因: 数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。

总的来说:

结构体的内存对齐是拿空间来换取时间的做法

既然这样,那在设计结构体的时候,我们既要满足对齐,又要节省空间,如何做到:让占用空间小的成员尽量集中在一起。 如:

#include<stdio.h>struct S1
{char c1;int i;char c2;
}struct S2//优化后
{char c1;char c2;int i;
}

4.如何修改默认对齐数

我们见过了 #pragma这个预处理指令,这里我们再次使用,可以改变我们的默认对齐数

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

谢谢观看,不要吝啬你们的三连哦!

结构体的内存对齐规则相关推荐

  1. c 定义结构体时提示应输入声明_C++|了解结构体的内存对齐(成员声明的顺序影响占用空间大小)...

    我们使用的电子计算机绝大部分都是冯·诺依曼结构的机器,遵循"存储程序"的概念.数据处理以存储为前提,在编程中数据如何"存得进去,取得出来",并且符合空间.时间效 ...

  2. 自定义类型详解:结构体(内存对齐、位段) + 枚举 + 联合

    目录 一.结构体 1.特殊的声明 2.结构体自引用 3.结构体变量的定义和初始化 4.打印结构体 二.==结构体内存对齐== 1.内存对齐 结构体嵌套如何求 为什么存在内存对齐? 2.修改默认对齐数 ...

  3. C语言:指针的偏移步长、结构体成员的偏移量、嵌套结构体成员的偏移量、结构体的内存对齐

    文章目录 1 不同类型指针的偏移步长 2 结构体成员的偏移量 3 嵌套结构体成员的偏移量 4 结构体的内存对齐 4.1 内存对齐的原因与优点 4.2 结构体内存对齐的规则 4.3 结构体嵌套结构体时的 ...

  4. 字节对齐《c和指针》笔记--包含位域结构体的内存对齐(32bit,GCC)

    最近使用开发的过程中出现了一个小问题,顺便记录一下原因和方法--字节对齐 C99划定int.unsigned   int和bool可以作为位域类型.但编译器几乎都对此作了扩展,答应其它类型类型的存在. ...

  5. 基于STM32使用嵌套结构体摸索内存对齐

    导读 一.结构体的声明以及初始化 二.结构体成员的内存对齐规则 三.联合体以及嵌套结构体的用法 位段 小端模式 三.位段数据跨字节单位导致的内存对齐现象 用来描述对象特征的各类信息,通常会被整合成记录 ...

  6. 简单理解结构体的内存对齐

    学习总结 内存对齐三原则: 数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子 ...

  7. 3.c语言结构体成员内存对齐详解

    一.关键一点 最关键的一点:结构体在内存中是一个矩形,而不是一个不规则形状 二.编程实战 1 #include <stdlib.h> 2 #include <stdio.h> ...

  8. C语言--结构体与内存对齐准则简单理解

    平时基本不涉及这个问题,被问起才发现没那么简单... 一,结构体:内存中所有类型字节之和 #include<stdio.h> struct icd {int a;char b;double ...

  9. [转]C++结构体|类 内存对齐详解

    内存地址对齐,是一种在计算机内存中排列数据(表现为变量的地址).访问数据(表现为CPU读取数据)的一种方式,包含了两种相互独立又相互关联的部分:基本数据对齐和结构体数据对齐 . 为什么需要内存对齐?对 ...

最新文章

  1. 【opencv】(4) 形态学处理:腐蚀膨胀、梯度运算、礼帽黑帽
  2. granfana telegraf influx安装与使用
  3. 3DSlicer13:Command Line Interface(CLI)
  4. javascript --- event loop
  5. MySQL 授权远程登录(Ubuntu 环境)
  6. 【转】ArcGIS Server安装
  7. 第三:Python发送邮件时中文附件下载乱码
  8. python_code_417
  9. 正确的CentOS系统配置
  10. uniyu 雷达波束_Unity使用TUIO协议接入雷达
  11. 第二课:基于树莓派的10个经典项目(树莓派能做什么)
  12. 当深度学习遇见自动文本摘要
  13. Python计算机视觉-仿射扭曲简单实例
  14. 中国人离婚率高达76.4%?这些指标背后真实的状况到底是什么样的?
  15. Copy Elision
  16. dva去掉访问路径中的“#”
  17. Linux ps命令详解,Linux查看进程
  18. 运营商,我看未必成为夕阳行业
  19. 笔记本计算机盖,怎么让笔记本盖子合上不待机-笔记本盖子合上 电脑继续运行的方法 - 河东软件园...
  20. Facebook创始人扎克伯格呼吁加强互联网监管

热门文章

  1. 国产麒麟系统安装mysql_MySQL数据库之麒麟操作系统安装mysql5.7.21
  2. 工程伦理课后习题参考答案(清华网课)
  3. 雅特力AT32F403A, 国产芯片PIN TO PIN 替代STM32F103
  4. 教python的app_Python教学
  5. MVPArms Retrofit RxJava实现注册
  6. 不同调制方式对信道容量影响的分析
  7. 微信小程序-帮你交通
  8. js计算字符串包含几个字符
  9. Flink SQL中使用异步io关联维表
  10. slurm作业管理系统怎么用?