结构体字节对齐

C++结构体字节对齐 C++中结构体字节对齐详解。在计算机中数据存储和传输以位(bit)为单位,每8个位bit组成1个字节(Byte)。32位计算机的字长为32位,即4个字节;对应的,64位计算机的字长为64位,即8个字节。计算机系统对基本类型数据在内存中存放的位置有限制,要求这些数据的起始地址的值是某个数k的倍数,这就是所谓的内存对齐,而这个k则被称为该数据类型的对齐模数。 阅读详情

在嵌入式开发时,常常需要注意结构体的字节对齐。当然了,不是说在PC上开发程序时不需要关注。只是两者关注的程度不一样。同时,不同的操作系统或者操作需求,字节对齐的原则也不一样。下面针对在PC上Microsoft Visual Stdio上分析结构体字节对齐的问题。

在使用sizeof运算符计算结构体占用的内存大小时,不是简单的将成员变量所占用的内存大小直接相加。这中间涉及到内存字节对齐的问题。为什么会存在字节对齐的问题呢?这是操作系统对内存操作、CPU机器周期等的优化的产物。如有的平台在地址为偶数的地方存取数据,而有的平台在奇数地址存取数据。如果在偶数地址存取数据的平台上,访问奇数地址的内容,则多需要一个读取指令。同样的问题会存在奇数地址存取的平台。为此有了内存对齐的概念。

以下在win32平台上讨论字节对齐的问题,其对齐策略有:

1)结构体变量的首地址能够被其最宽数据类型成员的大小整除。编译器在为结构体变量开辟空间时,首先找到结构体中最宽的数据类型,然后寻找内存地址能被该数据类型大小整除的位置,这个位置作为结构体变量的首地址。而将最宽数据类型的大小作为对齐标准。

struct 
{
	char a;
	short b;
	char c;
}stc_one;
&stc_one 0x00428278
&stc_one.a 0x00428278
&stc_one.b 0x0042827a
&stc_one.c 0x0042827c

可以看出这个结构体中最宽的数据类是short,占用2个字节。结构体变量的首地址可以被2整除。这个结构体是以2个字节为标准进行对齐的。

2)结构体每个成员相对结构体首地址的偏移量(offset)都是每个成员本身大小的整数倍,如有需要会在成员之间填充字节。编译器在为结构体成员开辟空 间时,首先检查预开辟空间的地址相对于结构体首地址的偏移量是否为该成员大小的整数倍,若是,则存放该成员;若不是,则填充若干字节,以达到整数倍的要 求。

3)结构体变量所占空间的大小必定是最宽数据类型大小的整数倍。如有需要会在最后一个成员末尾填充若干字节使得所占空间大小是最宽数据类型大小的整数倍

struct 
{
	char a;
	short b;
	char c;
	long d;
}stc_one;
该结构体中的最宽数据类型是long,其占用内存空间大小为4个字节,sizeof(stc_one) = 12.

下面结合实例一起看下sizeof是如何计算结构体占用的内存打下的。

1、空结构体:

struct 
{

}stc_three;
在C++的编译中为1个字节,而在C编译器中为0字节。

2、

struct 
{
	char a;
	int	 b;
	short c;
}stc_four;
该结构体以int型为标准,即以4字节为标准进行内存对齐。所以sizeof(stc_four) = 12个字节。

3、含有静态数据成员(注意:在C语言中的结构体中,是不允许有静态成员的。只有在C++中才可以)

struct 
{
	int a;
	long b;
	static long c;
}stc_five;
成员变量c是存放在静态区,没有在stc_five变量的存储空间中,所以sizeof(stc_five) = 8个字节。

4、结构体中包含结构体

typedef struct 
{
	char a;
	short b;
	char c;
	//long d;
}stc_one;
struct 
{
	bool   a;
	stc_one b;
	int c;	
}stc_six;
在stc_six中最宽的变量长度是stc_one,其为6个字节,所以在这6个字节中找最宽的变量长度作为stc_six的内存对齐标准。所以是2字节为标准对stc_six进行内存对齐的。故sizeof(stc_six) = 12个字节。注意:不要将stc_one完全拆开来比较。

在此,需要将stc_one和stc_six中的最宽成员变量进行比较,选择大的作为内存对齐的标准。即,如果stc_one大于stc_six中的其他成员变量的空间时,选用stc_one中的最宽成员变量的占用内存大小最为标准进行内存对齐。如果stc_one小于stc_six中的其他成员变量的空间时,选用占用空间大的作为标准。

5、强制以某一个数值为标准进行内存对齐

若在程序中使用了#pragma pack(n)命令强制以n字节对齐时,默认情况下n为8.

则比较n和结构体中最长数据类型所占的字节大小,取两者中小的一个作为对齐标准。

若需取消强制对齐方式,则可用命令#pragma pack()

#pragma pack(1)

typedef struct 
{
	char a;
	short b;
	char c;
	//long d;
}stc_one;

#pragma pack()

那么sizeof(stc_one) = 4个字节。








pack 字节对齐-调整版本 对于字节占用与对齐,excel表格中做了稍微修改,与12-27号版本比较,代码没有改动。 立即下载

相关推荐

避坑指南:WSL2网络模式修改导致无法上网的解决方案(附备份还原技巧)

本文深入解析WSL2默认网络隔离机制,并提供三种安全的端口互通方案,重点推荐通过配置Windows防火墙规则实现稳定访问。同时,针对网络配置修改可能引发的无法上网问题,给出了从重置配置到系统级备份的完整恢复指南,确保开发环境安全可靠。

jj890的博客 780

MFC中的内存对齐设置

有2个方法: 1 。#pragma pack(n)      n代表指定几个字节对齐 2。project  -> settings -》 C/C++  category -- Code Generation  -- struct member alignment  。。默认是

Welcome Home , Thierry Henry. 1393

VBA学习笔记6:将多个工作表中满足条件的数据汇总到同一个工作表

VBA学习笔记6:将多个工作表中满足条件的数据汇总到同一个工作表

weixin_45355881的博客 4708

C struct 中字节对齐问题

VC中下面几个结构体大小分别是多少呢struct MyStruct {     double m4;     char m1;     int  m3; }; struct MyStruct {     char m1;     double m4;     int m3; }; #pragma pack(push)//保存对齐状态 #p

ehui928的专栏 8920

Python实战:5分钟搞定固定翼无人机三自由度仿真(附完整代码)

本文提供了一个基于Python的固定翼无人机三自由度仿真快速实现方案。通过面向对象设计,封装了核心运动学模型,并对比了欧拉法与龙格-库塔法两种积分方法。文章附有完整实例代码,帮助算法工程师和研究人员在5分钟内搭建轻量级仿真环境,用于快速验证控制律、路径规划等核心算法逻辑。

docker7nomad的博客 747

SAC安装与相关库文件(.so)的安装

摘要 SAC: Seismic Analysis Code 是用于地震信号处理的一套软件。 本文将介绍SAC的安装,以及安装时遇到的一些问题。主要是一些动态库(lib**.so)找不到的问题。 本文的环境 64位的 Ubuntu 16.04 64位的系统是安装出现问题的主要原因 1. SAC获取与安装 SAC 的安装,只需要解压,然后修改环境变量即可!!!不需要任何编译!!! 1.1. SAC 获取与解压 SAC软件获取地址:http://ds.iris.edu/ds/nodes/dmc/forms/s.

WangCY的博客 4333

内存对其之#pragma pack

  pack(1)时,按一字节对齐,这样     struct   Size{     char   c1;       //占1个字节     int   i1;         //占4个字节     float   f1;     //占4个字节     double   d1;   //占8个字节     }   ;     一共17字节         pack(2)时,按二字节对齐

qj840828的专栏 367

CStatic类

CStatic类提供了一个Windows静态控件的功能。一个静态控件可以用来显示一 个文本字符串、方框、矩形、图标、光标、位图或增强的图元文件。它可以被用来作为 标签、方框或用来分隔其它的控件。静态控件通常不接收输入,也不提供输出;但是, 如果它具有SS_NOTIFY风格,则它可以通知其父有关设备点击的消息。 创建一个静态控件分两步。首先,调用构造函数来构造一个CStatic类的对象,然后

phenixyf的专栏 803

ABAP BDC 处理踩坑笔记:把错误挡在录制之前,把稳定做进每一行 BDCDATA

本文总结了SAP BDC(批输入)开发中的常见问题和解决方案。重点包括:1)理解BDCDATA本质是模拟人工操作而非直接操作数据库;2)数据格式化技巧,如金额、日期、物料号等字段的标准化处理;3)通过CTU_PARAMS参数控制执行环境,确保屏幕尺寸和更新模式一致;4)不要依赖sy-subrc,应通过解析MESSTAB消息判断业务是否成功;5)录制阶段的常见陷阱及解决方法;6)疑难问题的系统性解决思路;7)建议建立完善的错误处理机制,包括日志记录和重跑功能。文章提供了实用的ABAP代码示例和配置建议,帮助开

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

〖Python网络爬虫实战㊴〗- 极验滑块介绍(一)

我们对这个看到不陌生,现在,大多数平台都是用的是这个平台的验证码,我们今天来学习一下,极验滑块验证码的逆向,其他的都差不多。我们了解到这个平台提供了许多验证的方式。现在大多数还是滑块比较多,滑块验证码是一种常见的验证方式,其主要思路为用户通过拖动滑块来完成验证。具体流程如下:首先,用户需要进行滑块验证码的操作,网站会向用户展示一张图片,图片上通常会有一些随机的文字和背景干扰。用户需要通过鼠标拖动滑块,将其移动到指定位置上,通常是将滑块拖动到图片的相应位置上来完成验证。

爱吃饼干的小白鼠的博客 2878

字节对齐

字节对齐三原则        1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;   2) 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;例如上面第二个结构体变量的            地址空间。   3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。 概念:

80后程序员的技术分享 1077

MVDR算法: 自适应波束形成在信号处理领域中扮演着重要的角色。本文将介绍MVDR(最小方差无失真响应)算法,并提供相应的Matlab源代码实现。

MVDR算法是一种用于抑制干扰信号并增强感兴趣信号的自适应波束形成算法。它的基本思想是通过对干扰信号进行空间滤波,使其在感兴趣信号方向上的输出功率最小化。这种方法可以提高信号的质量和可辨识度,特别是在存在多个干扰源的复杂环境中。本文将介绍MVDR(最小方差无失真响应)算法,并提供相应的Matlab源代码实现。使用MVDR算法,我们可以通过对观测信号进行波束形成来抑制干扰信号并增强感兴趣信号。以上是MVDR算法的Matlab实现。的每一列代表一个阵列元素的观测信号。表示期望的波束指向,即感兴趣信号的方向。

HackWhisper的博客 1244

结构体字节对齐详解【含实例】

##一、前言 结构体字节对齐属于老生常谈的问题,看似简单,但却很容易忘记。而且因为结构体使用的普遍性,使得字节对齐也成为了一个不得不谈的话题。之前在C语言作业中有相应的题目,总结了一番,写下了这篇博客。最近抽出时间完善一番,便于以后查阅。 ##二、什么是结构体字节对齐 假设现在有一个结构体如下,问你它的一个对象占用几个字节? struct A{ int a; char b; short c; }; 我们知道这三个变量所占字节数分别为4,1,2,那么应该占用7个字节

x2528238270的博客 2万+

廖雪峰Python教程[完整版]

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

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

结构体字节对齐详解

假如有个结构体A如下,请问它占用了几个字节?以我们的直观感觉,char占用1个字节,int占用4个字节,short占用2个字节,因此总共占用7个字节。真是这样吗?让我们运行实测一下,测试程序exampl.cpp编译并执行程序,结果如下所示每个结构体的占用空间如我们所知道的char是1,int是4,short是2,累加结果应该为7,但最后结构体占用的字节却是12个,这个就是结构体的。...

liaoyaonline的博客 4700

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

c# 结构体 4字节对齐_结构体的字节对齐

先说结论:sizeof求得的结构体的大小并不一定等于各个数据成员的大小之和。struct 比如有如上两个结构体:A和B。都含有两个int型,一个double型数据成员,但成员的顺序不一样。如上图所示,int 和 double 分别为4个字节和8个字节。而结构体A和B使用sizeof的结果分别为16个字节和24个字节。可以看出结构体B所占的字节数并不等于其成员之和:sizeof(B) ≠ sizeo...

weixin_39669147的博客 1154

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C语言结构体字节对齐规则

C语言结构体字节对齐规则 基本规则 规则1 :结构体(struct)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存放在offset为该数据成员大小的整数倍的地方(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。 规则2:如果一个结构体B里嵌套另一个结构体A,则结构体A应从offset为A内部最大成员的整数倍的地方开始存储。(struct B里存有str...

annjeff的博客 1万+

C语言结构体的字节对齐

本文详细介绍了C语言中结构体字节对齐的规则,并根据该规则拓展了一些CPU读取系统内存的一些知识,联系到实际开发中,鼓励读者对提高自己编程能力的思考

Royi的学习博客 1596

结构体字节对齐问题

文章目录一、结构体必知知识二、结构体字节对齐有什么用?三、如何进行内存对齐?1.对齐规则:按结构体中最长类型字节为单位2.结构体嵌套的情况3.存在指定字节对齐单位的情况(#pragma pack)总结 一、结构体必知知识 1、结构体内成员按照声明顺序存储,第一个成员地址和整个结构体地址相同(第一个数据成员放在offset为0的地方)。 2、结构体中的某个成员地址为结构体变量的基址加上结构体变量在结构体中的偏移量。 二、结构体字节对齐有什么用? 1)平台原因(移植原因):不是所有的硬件平台都能访问任意地址上

lutongjia 2813

c# 结构体 4字节对齐_字节对齐(结构体)

最近在备战秋招,面经里很多次提到字节对齐,干脆整明白它!!!!20 字节对齐_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com这位大神的视频超级棒,看完绝对就会了,顺便可以用下面另一位高手的试题测试一下结构体 字节对齐的练习​www.jianshu.com我来自己总结一下:(也可以直接看最后的解题思路,但是看完的更好 )首先来看正常情况下的字节对齐(64位机器)...

weixin_39963819的博客 930

【C语言】结构体字节对齐

在C语言中,结构体(struct)的字节对齐(也称为内存对齐或数据对齐)是一种内存布局的优化手段,它涉及到结构体成员在内存中的排列方式。字节对齐的主要目的是提高内存访问的效率,因为大多数现代处理器在访问按照其字长(如32位或64位)对齐的内存地址时速度更快。自然对齐(成员对齐):每个成员变量的起始地址都是其大小的整数倍。例如,如果一个结构体包含一个int(假设int是4字节)和一个char(1字节),那么int成员的起始地址应该是4的倍数,而char成员的起始地址可以是任意地址。结构体对齐。

v13111329954的博客 1429

python结构体字节对齐_八字节对齐

字节对齐意义在进行c/c++开发时,特别是要求跨平台或者网络通信的时候,都会要求进行字节对齐,那为什么需要对齐,如果不对齐会有什么问题呢。(1) 存储方式:现代计算机处理器对存储的读取都是按照特定大小字节去读写(称其为一个存储单元),比如一个变量char,它的长度为1,但是在存储器中它占用的空间是一个存储单 元。当变量字节长度小于等于一个存储单元时,都将分配一个存储单元...

weixin_34677764的博客 902
上一篇: 函数指针 和 指针函数
下一篇: 蓝牙基带数据传输机理分析
SingleCode
博客等级 码龄15年 11粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值