1. 结构体声明 以及结构体变量创建

  2. 为什么会有内存对齐

  3. 如何计算内存对齐

在现实生活中 为了描述复杂个体 如 书本 人 单一的数据类型已无法满足我们的需要 这时候 自定义类型 结构体 孕育而生 结构是一些值的集合 里面的值称为成员变量 成员可以是不同类型的变量

结构体声明 以及结构体变量创建

struct Book //结构体声明
{char book_name[20];char bool_author[20];int price;char id[15];
};/*结构体声明是不开辟内存的结构体变量创建才是开辟了内存
*/结构体变量创建的两种方式
1.局部变量
int main()
{struct Book sb1;struct Book sb2;//结构体变量创建return 0;
}
2.全局变量
struct Book //结构体声明
{char book_name[20];char bool_author[20];int price;char id[15];
}sb3,sb4; // 结构体变量创建

粗略的介绍了下结构体声明和其变量的创建 现在我们开始研究结构体的内存是如何存储的? 

结构体的内存对齐

结构体在内存中是简单的顺序存储吗

struct S1 //结构体声明
{char c1;//1 int I;//4char c2;//1
};
struct S2 //结构体声明
{char c1;//1 char c2;//1int I;//4
};
printf("%d",sizeof(struct S1));
printf("%d",sizeof(struct S2));

以下是XCode环境下的运行结果 看看是不是你的预期结果

结构体内存对齐规则

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

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

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

VS中默认的值为8

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

4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整

体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

为什么会有内存对齐

1.平台原因(移植原因)

某些硬件是无法访问任意地址

2.性能原因

提高读取效率 拿空间换时间

技巧tip:尽量1将小的成员放在一起

默认对齐数

如何修改默认对齐数

#pragma pack(4) //设置默认对齐数

#pragma pack( )  //取消(恢复)默认对齐数

如何计算内存对齐

假设这是内存块

struct S1 //结构体声明
{
    char c1;//1 /8
      int I;//4 /8
    char c2;//1 /8
};

0.   c1   
1.  浪费
2.   浪费
3.    浪费
4.   int
5.   int. 
6.   int
7.   int 
8.  c2
9  浪费
10  浪费
11    浪费 struct s1 end
12. 
13
14
15

struct S2 //结构体声明
{
    char c1;//1 
    char c2;//1
      int I;//4
};

0。c1
1.  c2 
2. 浪费
3。浪费
4 int 
5 int 
6 int 
7int   struct s2 end
8
9
10
11
12
13
14
15

总结

以上就是本文的全部内容啦。喜欢的朋友一键三连 你的点赞是我创作的动力

一文搞懂结构体内存对齐相关推荐

  1. printf打印结构体_工程师:这道题80%初学者都没做对!你确定搞懂结构体内存对齐了?...

    这是工程师面试后的实际经历-- 这道经典.易错的关于C语言结构体内存对齐的题目,你真的会吗: 求32bit环境下以下结构体所占的字节数:typedef struct test_struct{ char ...

  2. 【C语言】一文搞定如何计算结构体的大小----结构体内存对齐规则

    要搞定如何正确地计算一个结构体的大小,我们就要深刻理解结构体内存对齐规则: 结构体内存对齐规则: 1.结构体的第一个成员永远在结构体起始位置偏移量为0的位置: 2.结构体成员从第二个成员开始,总是放在 ...

  3. c语言 char转int_图文并茂,一文讲透C语言结构体内存对齐

    ↑点击上方蓝色字体,关注"嵌入式软件实战派"获得更多精品干货. (以下有约5000字内容,建议收藏再读,推荐下载源码自行测试以加深理解.) 面试官:你知道C语言的结构体对齐吗? 应 ...

  4. 语言结构体在内存的分布_结构体内存对齐,这篇文章给你彻底搞会!(干货收藏)...

    脚本之家 你与百万开发者在一起 公众号:C语言编程 作者:薛定谔的coding猫 一.内存对齐的原因  1.平台原因(移植原因):一些资料上是这样说的,"不是所有的硬件平台都能访问任意地址上 ...

  5. c#往结构体里面读数据_结构体内存对齐,这回给你彻底搞会!

    一.内存对齐的原因  1.平台原因(移植原因):一些资料上是这样说的,"不是所有的硬件平台都能访问任意地址上的任意数据:某些硬件平台只能在某些特定地址处取某些特定的数据,否则就会抛出硬件异常 ...

  6. 细讲C语言结构体(结构体内存对齐你懂了吗?)

    结构体 结构体类型的声明 结构体自引用 结构体变量的定义和初始化 结构体内存对齐 结构体传参 结构体 结构体的声明 结构体是一些值集合的,里面可以包括char,int,double等等的各种类型构成的 ...

  7. 【APUE】Chapter17 Advanced IPC sign extension 结构体内存对齐

    17.1 Introduction 这一章主要讲了UNIX Domain Sockets这样的进程间通讯方式,并列举了具体的几个例子. 17.2 UNIX Domain Sockets 这是一种特殊s ...

  8. 关于C语言中的结构体内存对齐与位段问题

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 结构体的内存对齐与位段 一.结构体的内存对齐 1.为什么会有内存对齐? 2.如何内存对齐 3. 如何在设计结构体的时候,既要 ...

  9. 谈谈C语言中结构体内存对齐问题及其offsetof宏的基本使用

    前言 在C语言中,变量在内存中摆放的位置是有一定的规则的,不是想摆放到哪里就摆放到哪里,就比如常见的局部变量在栈区,全局变量在全局区等方式:而今天我们聊的结构体里面的成员变量呀,也是有一定的规则存放在 ...

最新文章

  1. 快速了解Kubernetes微服务中的通信
  2. Nginx的配置文件
  3. python语言程序设计书-清华大学出版社-图书详情-《Python语言程序设计》
  4. UA OPTI570 量子力学30 Degenerate Stationary Perturbation Theory简介
  5. 郑州大学采用计算机,郑州大学计算机系作业
  6. ios sqlite3 初级应用
  7. 腾讯云对象存储操作流程
  8. C++笔试题目大全(笔试宝典)
  9. mysql migration toolkit报错_MYSQL Migration Toolkit 安装
  10. 公众号网课搜题系统-掘光者题库
  11. 魅族20pro参数配置 魅族20pro值得买吗
  12. 如何禁止NavigationController的向右滑动返回
  13. 离散数学简单复习知识点汇总
  14. 常见的无法上网故障原因和解决方法
  15. echarts r 地图_pyecharts自定义地图
  16. Qt Quick 和qml介绍
  17. C++11的消息总线
  18. Inventor SDK入门---API设置零件材料
  19. 计算机软件大赛征稿,全国多媒体教育软件大奖赛征稿函
  20. 【中级软考—软件设计师】2操作系统2.2进程的概念【】:2.2.1进程的概念

热门文章

  1. 人工智能技术大爆发,离改变世界到底还有多远?【智库2861】
  2. 连续不一定可导的例子
  3. 支持多个微信同时登录的方法
  4. SDJZU-ASCII码
  5. 【考研经验】2018华东师范大学软件工程学硕初试复试一览(考408)
  6. 小型公司人事管理技巧
  7. 决定AMD命运的选择题:三大战略市场已定
  8. CSS常用选择器(通配符选择器,标签选择器,类选择器,id选择器.....),你知道多少?
  9. Win32 GDI TextOut与DrawText低效率深坑问题
  10. Json数据异常兼容处理