首页 > 系统相关 >【c】结构体内存对齐的规则

【c】结构体内存对齐的规则

时间:2024-09-03 17:04:17浏览次数:10  
标签:------------------------ int unsigned char 内存 规则 debug 对齐 体内

规则

一、成员变量内存相对起始位置为数据类型所占内存的整数倍(例如:int 类型数据相对起始位置必须是结构体中4字节的整数倍),若不足则需要对齐不足部分的内存(内存补充给前一个变量)。

二、结构体所占总内存为其成员变量中所占空间最大数据类型的整数倍。

三、结构体中每个成员相对于结构体起始地址的偏移量必须是该成员大小的倍数。

其中,最宽基本类型指的是 long double、double 和 long long 中占用空间最大的类型。如果结构体中没有这些类型的成员,则以 int 或者 char 作为最宽基本类型。

以下是一个示例,展示了一个结构体的内存对齐过程:

struct example {
    char a;       // 1 byte
    int b;        // 4 bytes
    double c;     // 8 bytes
    short d;      // 2 bytes
};

根据内存对齐规则,该结构体中的成员变量将按照以下方式进行排列:

------------------------|------------------------|
|  char a                |  padding (3 bytes)      |
|------------------------|------------------------|
|  int b                 |                        |
|------------------------|------------------------|
|  double c              |                        |
|------------------------|------------------------|
|  short d               |  padding (6 bytes)      |
|------------------------|------------------------

分析

由于 int 和 double 的大小都是 4 的倍数和 8 的倍数,因此它们的偏移量和结构体总大小都可以被 4 和 8 整除,而 short 的大小为 2,因此需要填充 6 个字节以满足偏移量为 8 的要求。

示例

#include <stdio.h>

typedef struct
{
    unsigned char a;
    unsigned int  b;
    unsigned char c;
} debug_size1_t;
typedef struct
{
    unsigned char a;
    unsigned char b;
    unsigned int  c;
} debug_size2_t;

int main(void)
{
    printf("debug_size1_t size=%lu,debug_size2_t size=%lu\r\n", sizeof(debug_size1_t), sizeof(debug_size2_t));
    return 0;
}

结果:
debug_size1_t size=12,debug_size2_t size=8
分析:
1.debug_size1_t 存储空间分布为a(1byte)+空闲(3byte)+b(4byte)+c(1byte)+空闲(3byte)=12(byte)。
1.debug_size2_t 存储空间分布为a(1byte)+b(1byte)+空闲(2byte)+c(4byte)=8(byte)。

参考链接

END

标签:------------------------,int,unsigned,char,内存,规则,debug,对齐,体内
From: https://www.cnblogs.com/anliux/p/18394952

相关文章

  • 【Azure Policy】添加策略用于审计Azure 网络安全组(NSG)规则 -- 只能特定的IP地址允
    问题描述对Azure上的虚拟机资源,需要进行安全管理。只有指定的IP地址才能够通过RDP/SSH远程到虚拟机上,有如下几点考虑:1)使用AzurePolicy服务,扫描订阅中全部的网络安全组(NSG:NetworkSecurityGroup)资源2)判断入站规则,判断是否是3389,22端口3)判断源地址是否是被允许的IP4)对......
  • 安全:nftables的常用命令(查看规则)
    一,nftables的地址簇和相应的iptables命令行工具nftables的地址簇iptables命令行工具ip  仅匹配IPv4数据包。如果没有指定地址系列,这是默认设置iptablesip6   ip6tablesinet   iptables和ip6tablesarp   arptablesbridge   ebtable......
  • springboot多媒体内容管理系统-计算机毕业设计源码08580
    摘 要随着人类向信息社会的不断迈进,风起云涌的信息时代正掀起一次新的革命,同时计算机网络技术高速发展,网络管理运用也变得越来越广泛。因此,建立一个多媒体内容管理系统(CMS)的设计与优化来管理多媒体内容信息,会使管理工作系统化、规范化,提高管理效率。本课题的研究对象是多媒......
  • 【Python系列】 参数默认规则
    ......
  • js变量命名的规则和规范
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="width=d......
  • NSIS 脚本,安装时添加防火墙规则
    场景在Windows上运行需要访问网络或者提供网络服务的程序,需要防火墙放行。默认情况下,在首次运行程序时,可能会有如下弹窗,只有用户点击运行才能继续使用网络。部分情况,可能是直接被拦截,都没有这个提示。Windows防火墙规则|MicrosoftLearn如果出现问题,手动处理的话,可以在W......
  • 物联网平台组件2: 平台校验规则
    加载不通的规则引擎配置文件,使用DynamicExpresso校验采集数据,得出是否告警  rules.json{"Rules":[{"Description":"温度超过阈值警报","Condition":"temperature>30","Action":"HT"},......
  • 【Azure Policy】添加策略用于审计Azure 网络安全组(NSG)规则 -- 只能特定的IP地址允
    问题描述对Azure上的虚拟机资源,需要进行安全管理。只有指定的IP地址才能够通过RDP/SSH远程到虚拟机上,有如下几点考虑:1)使用AzurePolicy服务,扫描订阅中全部的网络安全组(NSG:NetworkSecurityGroup)资源2)判断入站规则,判断是否是3389,22端口3)判断源地址是否是被允许的I......
  • 【Azure Policy】使用策略用于审计Azure 网络安全组(NSG)规则 -- 只能特定的IP地址允
    问题描述对Azure上的虚拟机资源,需要进行安全管理。只有指定的IP地址才能够通过RDP/SSH远程到虚拟机上,有如下几点考虑:1)使用AzurePolicy服务,扫描订阅中全部的网络安全组(NSG:NetworkSecurityGroup)资源2)判断入站规则,判断是否是3389,22端口3)判断源地址是否是被允许的IP4)对......
  • 【Azure Policy】添加策略用于审计Azure 网络安全组(NSG)规则 -- 只能特定的IP地址允
    问题描述对Azure上的虚拟机资源,需要进行安全管理。只有指定的IP地址才能够通过RDP/SSH远程到虚拟机上,有如下几点考虑:1)使用AzurePolicy服务,扫描订阅中全部的网络安全组(NSG:NetworkSecurityGroup)资源2)判断入站规则,判断是否是3389,22端口3)判断源地址是否是被允许的I......