C/C++中结构体的字节对齐示例

C/C++中的结构体的字节对齐和#paragma pack (n)编译命令 结构体的字节对齐方式    在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构、联合等)的数据单元。在结构中,编译器为结构的每个成员按其自然对齐边界(alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。如下结构:typedef stru 阅读详情

1.下面这段代码取消了结构体字节对齐优化,运行的结果为5个字节。

 

#include <stdio.h>
#include <stdlib.h>
#pragma pack(1)
typedef struct IntPair_s {
  char c;
  int num;
} IntPair;
#pragma pack()
int main(void) {
  size_t IntPairSize = sizeof( IntPair );
  printf( "Size of IntPair = %d\n", IntPairSize);

  return 0;
}

2.注释掉#pragma pack(1)和#pragma pack(),运行结果为8个字节。

#include <stdio.h>
#include <stdlib.h>
//#pragma pack(1)
typedef struct IntPair_s {
  char c;
  int num;
} IntPair;
//#pragma pack()
int main(void) {
  size_t IntPairSize = sizeof( IntPair );
  printf( "Size of IntPair = %d\n", IntPairSize);

  return 0;
}

关注公众号《首飞》回复“机器人”获取精心推荐的C/C++,Python,Docker,Qt,ROS1/2,机器人学等机器人行业常用技术资料。

C/C++中的字节对齐详解 字节对齐是指在结构体或联合体中,数据成员的起始地址相对于该结构体或联合体起始地址的偏移量必须是该成员大小的整数倍。比如,一个char类型的变量只需要占用一个字节,而int类型的变量通常占用四个字节,在结构体中排列时需要考虑它们的大小和对齐要求。按照数据成员对齐规则,a的对齐值为4,b和c的对齐值为1。因此,由于结构体对齐值为4,b和c会被填充2个字节对齐到4字节,从而使得结构体的大小为8字节。(1)数据成员对齐规则:数据成员的对齐值为其类型大小和结构体对齐大小中的较小值。C/C++中的字节对齐详解。 阅读详情

相关推荐

5分钟搞定内存字节对齐

写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的变量总长度要大,这是怎么回事呢?讲讲字节对齐吧.

【QT】Qt对大小端字节序的处理

1、Endian Order什么是大小端字节序(Endian Order)?以四字节十六进制整型数0x12345678为例,按照书写习惯,从左到右,高位在前,低位在后,我们称0x12为最高有效字节,0x78为最低有效字节,在存储这个数字时,需要四字节的地址空间,比如说从0x00到0x03,地址空间是从低地址0x00到高地址0x03的一段连续地址,那么,低地址存储最高有效字节的形式为大端(Big En

Making Life Better. Making Others Better. 2万+

Ubuntu双系统引导修复实战:boot-repair工具详解

本文详细介绍了使用boot-repair工具修复Ubuntu双系统引导丢失问题的实战方法。当GRUB引导菜单因安装新系统或更新而损坏时,通过制作Ubuntu启动盘进入Live环境,安装并运行boot-repair,可一键完成系统修复引导,自动化执行GRUB重装与配置,解决无法进入Windows或Ubuntu的常见故障。

weixin_29224589的博客 359

13、关于结构体对齐的问题

对齐方式(规则): 1) 当结构体内的元素的长度都小于处理器的倍数的时候,便以结构体里面最长的数据元素为对齐单位,也就是说结构体的长度一定    是最长的数据元素的整数倍 2) 如果结构体内存在长度大于处理器倍数的元素,那么就以处理器的倍数为对齐单位。但是结构体内类

WuHan MediaTek~~辉煌在于不懈的努力和拼搏! 539

【深度剖析】三一重工的数字化转型(中篇)

三一重工在数字化转型方面取得了提高效率、降低成本、加强研发创新和改善内控管理等多方面的成效。本研究旨在通过对三一重工数字化转型的深入分析,引导企业思考在第四次工业革命与第三次能源革命交汇的超级技术窗口期,如何进一步把握发展机遇,并为同行业其他企业提供探索性的建议。作为装备制造行业的佼佼者,三一重工的数字化转型受到了业界的广泛关注。作为行业内首批接触并实践数字化转型的企业之一,三一重工的转型经验不仅成功,而且积累了丰富的理论与实践,为其他制造业企业的数字化转型提供了可借鉴的范例。

领信卓越的博客 2308

实战指南:如何优雅解决SpringBoot3与Mybatis-Plus的版本兼容性问题

本文深入解析SpringBoot3与Mybatis-Plus的版本兼容性问题,提供实战解决方案。通过Maven依赖排除策略、Gradle配置方案及自动配置覆盖策略,有效解决包冲突和初始化顺序问题,确保项目平稳升级。适用于开发者快速解决SpringBoot3与Mybatis-Plus的集成难题。

weixin_28432777的博客 599

C++结构体字节对齐

结构体为什么要进行字节对齐?主要原因是加快变量在内存中的存取速度.我查了相关讨论对齐规则的资料,决定自己再整理一下. 对齐主要有两方面,一个是结构体里面的变量字节对齐,一个是结构体本身在进行对齐. 本文中基本数据类型占据大小分别为sizeof(char)=1.sizeof(short)=2,sizeof(int)=4,sizeof(float) =4,sizeof(double)=8 一 基

iaibeyond的专栏 3776

WPF+Prism+LiveCharts+materialdesignin 搭建WPF开发框架

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容。

T_Tboy的博客 3054

基于结构体sizeof的字节对齐问题讨论

这些天经常在论坛上看到有人问关于结构体的sizeof的问题,要解答这个问题,首先就必须要了解字节对齐的问题。下面就对此部分内容做一个简要的小结,方便以后查阅。(部分内容参考网上的资料,如有错误请读者指正)。首先我写了如下一段计算结构体大小的代码,测试一下我们所知道的理论是否和实际相同。#include using namespace std;//设置为向

delphiwcdj的专栏 1963

《基于YOLOv5/8/10的足球比赛球员识别系统毕设全指南:从开发到部署的一站式实战》

本文提出了一个基于YOLO系列模型的足球球员识别系统,具备完整的开发流程和技术方案。系统通过YOLOv5/8/10三大框架实现球员检测,平衡精度与速度需求。开发过程包含数据标注与增强、模型训练调优、PyQt5界面开发等关键环节,并提供了模型轻量化、多任务扩展等优化方向。系统可实现单张图像和视频流的实时识别,支持跨设备部署,适用于赛事分析和训练复盘场景。项目特色在于完整的技术实现路径和对不同YOLO框架的性能对比,为计算机视觉在体育领域的应用提供实践参考。

m0_71589036的博客 217

Coze智能体开发:开始使用扣子

扣子全新升级!它不仅能帮你办公、做视频、写代码,更具备自主任务执行、探索进化等能力,真正从“陪你聊”走向“帮你干活”。

王国平的博客 126

C/C++中避免系统的字节对齐

在定义了一个新的Struct后。 系统会按照一定的规则将新生命的类型变量进行字节对齐,如下结构体: typedef struct Test{ int a; char b[6]; }Test; 该结构体类型可能会被对齐为12个字节。 那么,在内存流和文件流操作中可能会出现这样的用法: fwrite(strPtr,1,sizeof(Test)*len,fp); 事实上,被写入了len

XiaoY 6696

【嘉立创EDA】从AD21导入pcb边界到嘉立创EDA专业版

有许多前期工程由AD进行完成,在后续update的过程中,由于开模等原因限制,部分pcb外型需要继续沿用,本文将此过程记录,以供有需要的读者参考。

l64481000的博客 4526

重温C与C++之结构体大小计算

前言 所谓基础不牢,地动山摇。笔者作为一个Android开发者,虽然有些NDK相关的开发经验,但是在写C或C++代码的时候总有一种知其然,不知其所以然的感觉。 随着后续可能在项目中使用大量使用C/C++代码,笔者意识到有必要巩固下自己的C/C++的基础,顺道给扫一下以前学习C/C++的时候留下的知识盲区。 后续可能会不定期更新一些自己复习C/C++的简要笔记,这些笔记更多的是自己温习的过程中对某个知识点的加上自己的理解,如有误人子弟,恳请各位手下留情。 字节对齐 对于结构体大小计算这个问题可以说是C/C++

u012944685的专栏 823

HTML音乐爱心3D旋转相册完整源码

HTML音乐爱心3D旋转相册完整源码

LilyCoder的博客 1380

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

c/c++下取消结构体字节对齐方法

转: 作者:码中飞翔 来源:优快云 原文:https://blog.youkuaiyun.com/wanxuexiang/article/details/86658855 版权声明:本文为博主原创文章,转载请附上博文链接! c/c++下取消结构体字节对齐方法 在c/c++下编译器会默认地对结构体进行对齐,其对齐的方法跟平台具体的特性有关,本文主要介绍结构体不进行对齐的方法。 1、结构体字节不进行...

2698

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C/C++字节对齐

一、字节对其概念:         如果一个变量的内存地址正好位于它长度的整数倍,它就被称做自然对齐。计算机中内存空间字节(byte)划分,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序地一个接一个地排放,这就是对齐。比如在32位cpu下,假设一个整型变量的地址为0x000

Gordennizaicunzai的博客 917

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

结构体字节对齐

本文系转载海子的博客,本人觉得写得非常好,重点讲的是结构体字节对齐,自己给重点地方加了标记: 在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列,而不是简单地

后起的博客 5465

结构体字节对齐的规则

字节对齐的计算规则 1、先看结构中最大类型的数据,包括嵌套结构体(如果有)。确定一行的最大数。 2、如果只有一个元素,那就是这个元素的大小,不需要补齐。 3、单一变量,先看看元素放到这一排的剩余位置能否完全放下,如果放不下,则从下一行的首地址开始放。 4、嵌套子结构体则要看看这个元素的整个大小(就是累加的大小,不是对齐的大小)放到这一排的剩余位置能不能放下,放不下则从下一行开始,子结构体中

qq_31332765的博客 1002

C/C++ 结构体字节对齐详解

本文详细介绍了C/C++中的结构体字节对齐机制,包括基本概念、对齐规则和示例分析。字节对齐确保数据成员满足硬件访问要求,提升性能但可能增加内存占用。文章通过具体结构体示例演示了偏移量计算和填充字节的插入过程,并介绍了使用#pragma pack和alignas控制对齐的方法。特别针对STM32平台,分析了典型对齐要求和编译器处理规则,强调合理设计结构体成员顺序以减少填充。最后指出强制修改对齐可能带来的风险,建议权衡性能与内存占用。

本博客分享软硬件一体化开发实战。硬件涵盖 PCB 设计、STM32 等 MCU 底层开发;软件包含 C++、Rust,Qt/QML、PyQt、Slint、TouchGFX、LVGL 各类 GUI 框架。方便软硬件开发者查阅学习。欢迎关注! 1975

从C语言到C++:结构体/类的大小

本文尽量全面覆盖计算结构体/类的大小计算的所以知识点,故每一部分不会写的很详细,若有不准确的地方可以在评论去讨论。 计算结构体大小时比较难且失误率比较高的面试题,实际变成中,个人感觉用处不大。 字节对齐的好处是提供CPU读效率,防止一次读对应多次汇编指令。在编写有关数据帧时,可使用“#pragma pack(1)”来取消字节对齐。数据帧要提供读效率的话,应从数据帧协议出直接考虑,而不是让结构体自动帮我们添加,这样容易出错。 目录 1 C语言中结构体大小(字节对其原则) 2 测试程序1 2.1 平

NoDistanceY的博客 564

字节对齐和C/C++函数调用方式学习总结(多篇节选)

字节对齐和C/C++函数调用方式学习总结created: 04-06-17last saved: author: ayixidelu前言:《***软件编程规范》中提到:“在定义结构数据类型时,为了提高系统效率,要注意4字节对齐原则……”。本文解释x86上字节对齐的机制,其他架构读者可自行试验。同时,本文对C/C++的函数调用方式进行了讨论。BTW想了几天要在休息时间写个总结但是直到今天18日才动手

mudboy的专栏 2909

结构体字节对齐 windows下

转载自http://www.cnblogs.com/longlybits/articles/2385343.html                                                         结构体字节对齐       在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题

p63423的专栏 1227

基于DRV8818与MK64的步进电机驱动方案全解析

步进电机作为开环位置控制的常用执行机构,在工业自动化设备中应用广泛。其运动性能不仅取决于电机本体,更依赖于驱动芯片与微控制器的协同设计。驱动芯片负责电流斩波、微步进细分与故障保护等底层逻辑,而MCU则通过PWM脉冲精确控制速度曲线与加减速过程。DRV8818双极步进驱动芯片集成双H桥与固定关断时间斩波电路,配合Cortex-M4内核的MK64系列MCU,可构建高性能、高可靠性的驱动方案。该组合适用于机器人关节、送料机构、旋转台等需要低速平稳、抗干扰能力强的工业场景。本文从选型逻辑、硬件连接、软件配置到常见失

weixin_33985679的博客 402

【c++】——sizeof与字节对齐

结构体字节对齐       在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列,而不是简单地顺序排列,这就是内存对齐。       内存对齐的原因:

蝉之洞 895
上一篇: IAR中设置了中断向量偏移时进行仿真的注意事项
下一篇: linux下挂接NFS的方法
首飞爱玩机器人
博客等级 码龄14年 6990粉丝 120原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

首飞爱玩机器人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值