C语言结构体sizeof对齐规则详解

C语言中sizeof求结构体大小(让你真正了解结构体成员在内存中的分布情况) 今天我在写程序的时候我发现当一个结构体里面的成员变量相同的时候但是顺序不同的时候,所消耗的内存大小是不一样的, 因为我对内存的消耗很敏感,我想它具体是怎么用的 ,于是我具体看了下关于结构体成员在内存里面的分布情况 在这里我在这里记录下我的理解心得: 我们都知道运算符sizeof可以计算出给定类型的大小,对于32位系统来说,sizeof(char) = 1; sizeof(short)=2;s 阅读详情

在C语言中,使用sizeof运算符计算结构体的大小时,得到的结果是对齐之后占用的字节数,而非成员变量实际长度的简单相加。这是因为编译器会根据平台的对齐规则,在成员之间或结构体末尾插入填充字节,以优化内存访问效率。


C语言结构体对齐规则:
结构体(struct)的数据成员,第一个数据成员存放的地址为结构体变量偏移量为0的地址处.

其他结构体成员自身对齐时,存放的地址为min{有效对齐值为自身对齐值, 指定对齐值} 的最小整数倍的地址处.
注:自身对齐值:结构体变量里每个成员的自身大小
注:指定对齐值:有宏 #pragma pack(N) 指定的值,这里面的 N一定是2的幂次方.如1,2,4,8,16等.如果没有通过宏那么在32位Linux主机上默认指定对齐值为4,64位的默认对齐值为8,AMR CPU默认指定对齐值为8;
注:有效对齐值:结构体成员自身对齐时有效对齐值为自身对齐值与指定对齐值中 较小的一个.

总体对齐时,字节大小是min{所有成员中自身对齐值最大的, 指定对齐值} 的整数倍.

#pragma pack(N) 每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。

详细解释

  1. 对齐规则:

    • 每个成员的偏移量必须是其类型大小(或编译器指定的对齐值)的整数倍。

    • 整个结构体的大小必须是其最大成员大小的整数倍(末尾可能填充)。

    • 成员的顺序会影响填充字节的数量。

  2. 编译器行为:

    • 编译器会插入“填充字节”(Padding)以满足对齐要求。

    • 默认对齐值通常由目标平台决定(如32位系统通常按4字节对齐)。


示例说明

示例1:成员顺序影响结构体大小
#include <stdio.h>

struct Example1 {
    char a;      // 1字节
    int b;       // 4字节
    char c;      // 1字节
};

struct Example2 {
    char a;      // 1字节
    char c;      // 1字节
    int b;       // 4字节
};

int main() {
    printf("Example1 大小: %zu\n", sizeof(struct Example1));  // 输出 12
    printf("Example2 大小: %zu\n", sizeof(struct Example2));  // 输出 8
    return 0;
}
  • Example1 的内存布局:

    • char a 占1字节。

    • 填充3字节(为了对齐int b到4字节)。

    • int b 占4字节。

    • char c 占1字节。

    • 末尾填充3字节(使总大小为最大成员int的整数倍)。

    • 总计:1 + 3 + 4 + 1 + 3 = 12字节。

  • Example2 的内存布局:

    • char a 和 char c 共占2字节。

    • 填充2字节(为了对齐int b到4字节)。

    • int b 占4字节。

    • 总计:2 + 2 + 4 = 8字节。

示例2:结构体末尾填充

struct Example3 {
    short a;     // 2字节
    int b;       // 4字节
};

int main() {
    printf("Example3 大小: %zu\n", sizeof(struct Example3));  // 输出 8
    return 0;
}

  • Example3 的内存布局:

    • short a 占2字节。

    • 填充2字节(为了对齐int b到4字节)。

    • int b 占4字节。

    • 总计:2 + 2 + 4 = 8字节。


关键结论

  • sizeof的结果是对齐后的总大小,包含填充字节。

  • 成员顺序和类型大小直接影响结构体大小。

  • 可通过调整成员顺序或使用编译指令(如#pragma pack)优化内存占用。

提示:若想减少填充字节,可将相同类型的成员连续声明,或手动控制对齐方式(但需谨慎,可能影响性能)。

C语言sizeof求结构体大小问题汇总 可以说一直被各类结构体大小问题说困扰,花了大半天时间查了一下资料,现在整理汇总一下。 sizeof:C语言中判断数据类型或者表达式长度符;不是一个函数,字节数的计算在程序编译时进行,而不是在程序执行的过程中才计算出来。 基本数据类型的大小很好计算,我们主要看一下构造数据类型的大小,包括数组,结构体和共用体。 阅读详情

相关推荐

C语言结构体的字节对齐原则

为什么要对齐?   现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。   对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特

shenbin1430的专栏 1万+

sizeof(结构体)的大小判断

结构体字节数大小的计算(多种情况)

ajin156的博客 8247

实战分享:如何用本地替换和插桩调试搞定Kasada最新版x-kpsdk-cd环境检测

本文深入解析Kasada最新版x-kpsdk-cd环境检测机制,提供动态请求拦截、本地替换和函数插桩等实战调试策略。通过Proxy保护破解、关键函数断点调试和环境检测对抗方案,帮助逆向工程师有效应对从280位扩展到294位的加密数组挑战,实现高效补环境调试。

weixin_29251567的博客 569

sizeof 结构体_sizeof运算符

@[toc]一、基本概念sizeof是C语言的关键字,它用来计算变量(或数据类型)在当前系统中占用内存的字节数。sizeof不是函数,产生这样的疑问是因为sizeof的书写确实有点像函数,sizeof有两种写法:用于数据类型sizeof(数据类型); 数据类型必须用括号括住。 printf("字符型变量占用的内存是=%dn",sizeof(char)); // 输出:字符型变量占用的内存是=...

weixin_36464343的博客 9013

新手必看:电路设计里的‘地’到底怎么接?单点、多点、混合接地保姆级图解

本文深入解析电路设计中的接地技术,涵盖单点、多点和混合接地的原理与应用。通过详细的图解和实战案例,帮助新手理解接地在提供参考电位、构成电流回路及抑制电磁干扰中的关键作用,避免常见设计误区,提升电路稳定性与抗干扰能力。

weixin_28455801的博客 298

抖音无人直播技术全解析:从原理、实操到合规化思考

直播技术作为内容分发的核心形式,其底层依赖于流媒体协议(如RTMP)与实时音视频编码推流。通过OBS等软件进行场景合成与虚拟摄像头技术,可以实现丰富的画面包装与自动化播放。这项技术的核心价值在于突破人力与时间的限制,实现内容的持续输出与流量获取,在电商带货、品牌展示、陪伴式内容等场景中具有应用潜力。然而,单纯依赖录播循环存在高风险,平台风控系统会通过内容重复性检测与互动行为模型进行识别。因此,更可持续的方向是探索“半无人直播”或自动化辅助工具,例如利用AI数字人驱动或直播切片技术,在合规前提下提升运营效率。

weixin_29895109的博客 508

sizeof全面总结——举一反三详细介绍sizeof(结构体)

字节 short int float long *(地址) double long long 32位 2 4 4 4 ...

EVEcho的博客 3万+

多任务学习中的过拟合陷阱:动态停止训练机制详解与避坑指南

本文深入剖析了多任务学习中因任务过拟合不同步导致的性能下降问题,并详细介绍了动态停止-继续训练机制。该机制通过为每个任务设置独立的训练开关,基于验证集性能动态控制其梯度更新,有效缓解了任务间负迁移,是提升多任务模型整体泛化能力的关键策略。

happy2的博客 1092

使用sizeof()计算结构体大小

下面代码的输出结果是: #include <iostream> using namespace std; #pragma pack(4) struct T{ char a; short b; char c; }; #pragma pack() int main() { cout << sizeof(T) << endl; return 0; } A. 4 B. 5 C. 8

92377 1万+

云原生之容器编排实践-在K8S集群中使用Registry2搭建私有镜像仓库

基于前面搭建的3节点 Kubernetes 集群,今天我们使用 Registry2 搭建私有镜像仓库,这在镜像安全性以及离线环境下运维等方面具有重要意义。作为测试环境,本次使用 Registry2 搭建了私有镜像仓库,实际生产环境建议使用 Harbor;创建了一个 local-storage 的 StorageClass ,并使用本地磁盘的方式创建使用 PV ,实际建议使用 NFS 。

Heartsuit的博客 2462

如何使用tinyalas接口从usb录音的同时从扬声器播放

3、 以上步骤确认完后,就可以修改tinyhostless.c程序,tinyhostless的本质就是边pcm_read(),边pcm_write();但原本tinyhostless只支持对同一声卡进行操作,所有需要修改其代码,改成录音和播放可支持不同声卡,如果是模拟声卡,有回环测试,可以实现边录边播放,但涉及USB声卡时,就没有现场的类似功能,有时候客户因为硬件特殊性,会有从USB录音的同时从扬声器播放出来的需求,本文简要描述如何使用tinyalsa接口实现该需求;

sdrgtywretyeruet的专栏 971

C语言中结构体的对齐规则、sizeof(结构体变量)

1、以最大类型的字节为单位 结构体(struct)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存放在offset为该数据成员大小的的整数倍的地方(比如int在32位机器上为4字节,则要从四字节的整数倍开始存储)。考虑如下一段代码: #include <stdio.h> struct example_1 { int a; char b; short c; }A; struct example_2 { char e[...

qq_39997903的博客 1454

SDA 还是 SDI:SAP HANA 数据虚拟化与数据集成的取舍、组合与实战

结论先放在前面:SDA 面向数据虚拟化与联邦查询,强调不落地、不复制、按需实时访问;SDI 面向数据集成与复制,强调抽取、转换、装载与近实时增量同步。两者共享 Remote Source 与 Adapter 的理念,但侧重点与运行时组件明显不同。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 585

不用sizeof怎么直接看出来结构体的大小?——C语言

计算结构体大小的方法

shallrelow的博客 1133

duilib 之 事件--bubbled冒泡事件应用、通用点击事件、进入离开事件、XML样式中直接添加事件

1. box 绑定点击事件 ui::Box *pSmallVideoBox = (ui::Box*)FindControl(L"rightBox"); if (pSmallVideoBox) { auto SwitchVideo = [this](ui::EventArgs* param){ m_bSecScreenIsScale = m_bMainScre...

目前打算换一个工作,有招聘windows c++方向的也欢迎联系,北京、济南 最好 973

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【C 语言入门】结构体的内存对齐

结构体是一组不同类型变量的集合,这些变量叫成员变量。比如我们要描述一个学生,包含名字、年龄、性别、学号,用单个变量存太零散,结构体就能完美封装。结构体是不同类型的集合,声明结尾必须有分号。初始化支持顺序和指定成员两种方式。成员访问:变量用点,指针用箭头->。内存对齐:按规则算大小,小成员集中放更省空间。传参优先传地址,效率更高。位段省空间,但跨平台差。

wuqingyigexiaoba的博客 845

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C语言结构体对齐详解

详解如何快速判断C语言结构体占用空间大小

只为改变自己 5860

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C语言结构体对齐是怎么计算

摘要:本文探讨了C/C++中结构体对齐问题,通过实例分析结构体成员大小累加与整体大小的差异。介绍了sizeof和offsetof的使用方法,并通过代码实测展示了结构体内存对齐现象。结果显示,由于字节对齐机制,结构体成员大小累加和与整体大小不一致,验证了结构体对齐对内存占用的影响。文章还提供了打印结构体成员地址的方法,帮助理解内存对齐的具体表现。

码农爱学习的博客 1261

C语言的结构体详解

结构体的定义使用struct关键字,通常放在函数外部或全局作用域中。在上述示例中,我们定义了一个名为Personname(字符数组)、age(整数)和height(浮点数)。可以使用已定义的结构体创建变量,并对其进行初始化。在上述示例中,我们声明了两个结构体变量person1和person2,并对person2进行了初始化。使用点操作符()来访问结构体变量的成员。上述示例中,我们使用点操作符访问person2结构体变量的成员,并将它们打印出来。结构体作为函数参数:可以将结构体作为函数的参数传递。

z6665454的博客 1175

C语言中的sizeof

在CU的C/C++版看到一个例子:http://bbs.chinaunix.net/thread-3621056-1-1.html #include stdio.h> struct A{         char a;         char b;         int c[0]; }; struct B{

如丧 703

C语言中的结构体

结构体相关知识

2401_83703513的博客 1968

c语言中结构体对齐,C语言中结构体对齐.pdf

C语言中结构体对齐,c语言结构体对齐,c语言结构体内存对齐,c语言结构体字节对齐,c语言中的结构体,c语言中结构体的使用,c语言中结构体,c语言中结构体的定义,c语言中结构体定义,c语言结构体C 语言中结构体对齐(来自网络)C 语言结构体对齐也是老生常谈的话题了。基本上是面试题的必考题。内容虽然很基础,但一不小心就会弄错。写出一个struct,然后sizeof ,你会不会经常对结果感到奇怪?siz...

weixin_31151281的博客 159

滴水逆向三期笔记与作业——02C语言——09 字节对齐_结构体数组

滴水逆向三期笔记与作业——02C语言——09 字节对齐_结构体数组。

weixin_43657383的博客 1669

C语言大小问题,C语言sizeof求结构体大小问题汇总

可以说一直被各类结构体大小问题所困扰,花了大半天时间查了一下资料,现在整理汇总如下。sizeof:C语言中判断数据类型或者表达式长度符;不是一个函数,字节数的计算在程序编译时进行,而不是在程序执行的过程中才计算出来。基本数据类型的大小很好计算,我们主要看一下构造数据类型的大小,包括数组,结构体和共用体。1、数组类型,计算单个元素的大小,整个数组大小就是单个元素大小乘以元素个数。char a[] =...

weixin_42139460的博客 912

计算结构体的大小--结构体的内存对齐规则

在C语言中,计算数据的大小,就要使用 sizeof 来计算其大小,单位是字节。C语言中的内置类型的数据,其所占字节的大小是固定的。此外,C语言中还有一些自定义的类型,如结构体,枚举等。今天,我们来讨论结构体的大小。我们来看一段代码,该结构体的大小为多少呢?如果按照常规想法,应该是1+4+1=6个字节,不过大胆猜测一番,肯定不会这么简单。我们看到,结果为12,难道其占的大小为2倍?我们可以验证我们可以看到,结构体s1和s2变量类型相同,只是放置位置不同,但其字节数却又发生了变化。

friendhan2005的博客 741

详细解析C语言中的sizeof

 一、sizeof的概念       sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 二、sizeof的使用方法  1、用于数据类型    sizeof使用形式:sizeof(type)数据类型必须用括号括住。如s

cglover的专栏 777
上一篇: FreeRTOS中互斥量实现数据共享优化
下一篇: C语言中字符串变量的处理
dzdesigned
博客等级 码龄17年 72粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值