规则一.: 每个成员变量在其结构体内的偏移量都是成员变量类型的大小的倍数。

    规则二: 如果有嵌套结构体,那么内嵌结构体的第一个成员变量在外结构体中的偏移量,是内嵌结构体中那个数据类型大小最大的成员变量的倍数。

    规则三: 整个结构体的大小要是这个结构体内数据类型大小最大的成员变量的倍数。如果有内嵌结构体,那么取内嵌结构体中数据类型大小最大的成员变量作为计算外结构体整体大小的依据。

例子

typedef struct TEST{
int na;
char cb;
char cc;
int nd;
char cf;
struct TT{
int ng;
long long llh;
}tt;
char ci;
}test;

                        图一

  如上图所示,根据规则一,nd在结构体内的位置必须满足是其自身数据类型大小的整数倍,且倍数要取满足条件的最小倍数。因为nd前三个成员变量总大小是6Bytes,nd作为int类型,其数据类型大小是4Bytes,满足条件的最小倍数是2,所以nd在结构体中的偏移量是8,故填充2Bytes。

  根据规则二,ng作为内嵌结构体的第一个成员变量,它在外结构体中的偏移量要满足——其内嵌结构体中最大数据类型大小的倍数。在计算cf偏移量后,当前偏移量是13,而内嵌结构体中最大数据类型为long long,其大小为8,ng的偏移量必须是8的倍数,且取大于13的最小倍数,即2。所以ng前要填充3Bytes。

  根据规则三,计算完ci后,当前偏移量是33。如果要满足test结构体的大小是其中最大数据成员类型大小的倍数,在此例中是内嵌结构体的成员变量llh,即8的倍数。所以要填充7Bytes。

参考

CSDN博客:https://blog.csdn.net/zhanghow/article/details/55262988

c\c++里struct字节对齐规则的更多相关文章

  1. C++内存字节对齐规则

    为什么要进行内存对齐以及对齐规则 C/C++—— 内存字节对齐规则 C++内存字节对齐规则

  2. struct 字节对齐详解

    一.什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问, ...

  3. struct字节对齐原则

    原则1:windows下,k字节基本类型以k字节倍数偏移量对齐,自定义结构体则以结构体中最高p字节基本类型的p字节倍数偏移量对齐,Linux下则以2或4字节对齐; 原则2:整体对齐原则,例如数组结构体 ...

  4. C语言中的字节对齐以及其相关处理

    首先,我们来了解下一些基本原理: 一.什么是字节对齐一个基本类型的变量在内存中占用n个字节,则该变量的起始地址必须能够被n整除,即: 存放起始地址 % n = 0,那么,就成该变量是字节对齐的;对于结 ...

  5. ACE的CDR中的字节对齐问题

    大家应该都知道计算机中间都有字节对齐问题.CPU访问内存的时候,如果从特定的地址开始访问一般可以加快速度,比如在32位机器上,如果一个32位的整数被放在能被32模除等于0的地址上,只需要访问一次,而如 ...

  6. C++:struct和union 内存字节对齐问题

    转自:http://blog.csdn.net/wangyanguiyiyang/article/details/53312049 struct内存对齐问题 1:数据成员对齐规则:结构(struct) ...

  7. struct/class等内存字节对齐问题详解

    问题引入 定义一个结构体的一般形式为: struct 结构体名 { //类型说明符 成员名; }; 例如有如下结构体: struct Stu { int id; char sex; float hig ...

  8. 浅析内存对齐与ANSI C中struct型数据的内存布局-内存对齐规则

    这些问题或许对不少朋友来说还有点模糊,那么本文就试着探究它们背后的秘密. 首先,至少有一点可以肯定,那就是ANSI C保证结构体中各字段在内存中出现的位置是随它们的声明顺序依次递增的,并且第一个字段的 ...

  9. C语言中内存对齐规则讨论(struct)

    C语言中内存对齐规则讨论(struct) 对齐: 现代计算机中内存空间都是按着byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地 ...

随机推荐

  1. Python 爬虫基础Selenium

    https://blog.csdn.net/weixin_36279318/article/details/79475388

  2. Linux内存管理专题

    Linux的内存管理涉及到的内容非常庞杂,而且与内核的方方面面耦合在一起,想要理解透彻非常困难. 在开始学习之前进行了一些准备工作<如何展开Linux Memory Management学习?& ...

  3. [翻译] ASP.NET Core 2.2 正式版发布

    本文为翻译,原文地址:https://blogs.msdn.microsoft.com/webdev/2018/12/04/asp-net-core-2-2-available-today/ 我(文章 ...

  4. springmvc上传文件错误The current request is not a multipart request

    <1>在jsp页面的<head></head>标签里面加上<meta http-equiv="Content-Type" content= ...

  5. VMware Workstation 14安装VMware Tools

    1 单击虚拟机,选择安装VMware Tools 2 此时会在桌面出现VWware Tools 3 双击进入 4 把*.tar.gz压缩文件cp到/home下 5 sudo tar -zvxf  *. ...

  6. VSCode python 遇到的问题:vscode can't open file '<unprintable file name>': [Errno 2] No such file or directory

    代码很简单,就两行: import pandas as pd import netCDF4 as nc dataset = nc.Dataset('20150101.nc') 环境:在VSCode中左 ...

  7. Docker 核心技术之网络管理

    为什么需要Docker网络管理 容器的网络默认与宿主机.与其他容器都是相互隔离. 容器中可以运行一些网络应用(如nginx.web应用.数据库等),如果要让外部也可以访问这些容器内运行的网络应用,那么 ...

  8. AI佳作解读系列(三)——深度学习中的合成数据研究

    Below are some investigation resources for synthetic datasets: 1. Synthetic datasets vs. real images ...

  9. sqlserver2008R2 评估期已过

    早上打开win程序-卡死不动了,查看三层数据库连接-连接不上数据库 打开数据库-提示 评估期已过 解决方法: 进入sqlserver的安装中心-点击 维护-版本升级 输入密钥:企业版:R88PF-GM ...

  10. feign多文件上传

    参考地址:https://www.cnblogs.com/standup/p/9090113.html https://www.cnblogs.com/standup/p/9093753.html 1 ...