C/C++中的struct字节对齐问题

【C++ - 13】C/C++中struct研究 一. C和C++中struct的区别 C语言中struct是用户自定义的数据类型,它是没有权限设置的,它只能是一些变量的集合体,虽然可以封装数据但是不能够隐藏数据,而且成员也不可以是函数。 C++中struct是抽象数据类型,它支持成员函数的定义,并且有访问权限,C++中struct默认访问权限是public。 主要区别有以下三点 1. C语言中struct不能有成员函数,而C++中... 阅读详情

字节对齐问题在面试笔试中经常碰到,自己也在这里经常碰到坑,今天索性把这方面搞清楚,记录自己这方面的学习过程。

大端小端法

机器的大端小端问题一直是一个常考的点,并且struct的内存布局问题和这个大端小端有很大关系,这里先看下机器的大端小端问题:
下面通过一张图来说明问题,假如一个变量int x的值为0x12345678,当在不同的机器上存储顺序是不同的
大端小端图
可以看到,大端机器上低地址存储的是高位,小端则恰恰相反。用一个C语言程序来测试你的机器是大端还是小端的好的方式如下:

show_bytes()
{
    int x = 0x12345678;
    unsigned char *p = (unsigned char*)&x;
    int i = 0;
    for(i = 0; i < sizeof(int);i++)
    {
        printf("%.2x",p[i]);
    }
    printf("\n");
}

这段代码可以看出当前系统是大端还是小端,在我的机器上显示的是78563412,因此我的电脑是小端模式。

struct 与union的对齐规则

  • struct或者union的数据成员对齐规则:第一个放在offset位置为0处,从第二个开始,该元素与前一个元素之间的填充是由该元素字长与#pragma pack(k)(k=1,2,4,8,16)中的k之间的小者来决定。如果本身为两者之间的小者的整数倍,则不进行填充。即除去第一个元素,其余的元素的开始位置是由两者之间的小者的整数倍来决定的
  • 整体填充完毕后,该struct整体大小是由pack(k)指定的k与数据元素里面最大字长之间的小者决定。
    下面举几个例子来说明字节对齐遵循的规则
#pragma pack(k)//k=1,2,4,8,16
    struct S4 {
        char x1;
        double x2;
        short x3;
        float x4;
        char x5;
    };
  cout<< sizeof(S4) << endl; 

可以打印k分别等于1,2,4,8,16时S4的占用的大小空间,可以得到的结果分别为

16
18
24
32
32 //和k为8的结果相同

k为1的时候,此时不进行对齐,因此为所有变量的字长之和。下面从k为2的时候开始分析
- k = 2 时,第一个元素从offset为0的地址开始,第二个元素是double占8个字节,和当前k=2对比,2较小,又因为第一个元素是char,只占用一个字节,因此第二个元素和第一个元素之间需要达到2的倍数,需要填充1个字节;再看x3,x3占用2字节和k=2相等,而x1和x2已经占用了10字节,为2的倍数,因此x3和x2之间不填充字节;再看x4,占用4字节,比k=2大,而前三个元素已经12字节,为2的倍数,因此不需要填充。最后一个元素也不用填充。整体为18字节。整体18个字节,是2的倍数,因此最后一个元素不需要填充。下面是内存布局图:
这里写图片描述
其它的情况和这个类似,可以对比着画出来。

从零构建:用Simulink搭建固定翼无人机六自由度模型的避坑指南 本文详细介绍了使用Simulink从零构建固定翼无人机六自由度动力学模型的完整流程和避坑指南。重点解析了模型架构设计、气动力计算、参数配置、仿真求解器选择等关键环节的常见问题与解决方案,帮助开发者快速建立准确可靠的无人机控制系统仿真模型。 阅读详情

相关推荐

分享一下使用Xilinx FPGA驱动MIPI DSI LCD屏的心路历程

分享一下调试用Xilinx FPGA驱动MIPI DSI LCD屏的心路历程,看到的朋友们,可以避免继续踩坑。

haoxingheng的专栏 5014

关于C/C++中struct对齐的问题

struct 为结构体,在计算机中占用的内存的总数为

fantasydreams的专栏 1058

使用podman 容器化安装DIFY

本文阐述了使用podman容器化安装DIFY的过程

wengad的博客 1901

结构体struct的对齐问题

结构体struct的自然对齐问题 下面的机构体 struct A {     char c;     int i;     char cc; }; 它的sizeof()是多少呢? 如果是紧凑对齐的话,当然是sizeof(char)+sizeof(int)+sizeof(char); 但编译器默认编译的却不是紧凑对齐的,在32-bit的机器上编译结果是12, 这是一个char占用了一

Jason_351的专栏 621

STM32H743VIT6最小系统板PCB设计全流程(AD09实战教程+封装库分享)

本文详细介绍了基于STM32H743VIT6高性能MCU的最小系统板PCB设计全流程。内容涵盖从项目规划、原理图设计到PCB布局布线的AD09实战操作,重点解析了高速电路设计中的电源、时钟、去耦等关键模块的处理要点与常见陷阱,并分享了经过验证的封装库资源,旨在为工程师提供一套完整、可靠的设计方法与实战参考。

weixin_29194693的博客 118

LLaMA-Factory全面指南:从训练到部署

LLaMA-Factory项目是一个专注于大模型训练、微调、推理和部署的开源平台。其主要目标是提供一个全面且高效的解决方案,帮助研究人员和开发者快速实现大模型的定制化需求。简化大模型训练流程:通过提供一系列预设的训练脚本和参数配置,降低用户在训练大模型时的技术门槛,使得即使是初学者也能轻松上手。增强模型微调能力:支持多种微调方法,如LoRA、QLoRA等,使用户能够根据特定任务需求对模型进行精细调整,从而提升模型性能。优化推理和部署体验。

全世界的博客 1万+

结构体struct的自然对齐问题(经典)

结构体struct的自然对齐问题下面的机构体struct A{    char c;    int i;    char cc;};它的sizeof()是多少呢? 如果是紧凑对齐的话,当然是sizeof(char)+sizeof(int)+sizeof(char); 但编译器默认编译的却不是紧凑对齐的,在32-bit的机器上编译结果是12, 这是一个char占用了一个int的空间,换句话说,在c和i之间有三个空余的byte! 这就是自然对齐的效果。为什么要自然对齐呢?当初百度的gg电面我的时候,我胡乱的解释

zhangxinrun的专栏 1万+

RK3568平台开发系列讲解(中断及异常篇)中断下半部:中断线程化

以前用 work 来线程化地处理中断,一个 worker 线程只能由一个 CPU 执行, 多个中断的 work 都由同一个 worker 线程来处理,在单 CPU 系统中也只能忍着 了。少数中断不能线程化,典型的例子是时钟中断,有些流氓进程不主动让出处理器,内核只能依靠周期性的时钟中断夺回处理器的控制权,时钟中断是调度器的脉搏。中断处理线程是优先级为50、调度策略是SCHED_FIFO的实时内核线程,名称是“irq/”后面跟着Linux中断号,线程处理函数是。,说明是线程化的中断,那么唤醒中断处理线程。

内核笔记 435

【C++】关于结构体内存对齐的问题

x86:指针是4字节,类A的大小是16,8与16的较小者是8。内存大小为:8 + 16 + 8 + 4 = 36,又因为36不是最大对齐数8的倍数,所以内存向后偏移,大小为 40。x64:指针是8字节,类A大小为24,8与24的较小者是8。内存大小为:8 + 24 + 8 +8 = 48,48刚好是最大对齐数8的倍数,所以内存大小为48。所以说,字节对齐的根本原因其实在于cpu读取内存的效率问题,对齐以后,cpu读取内存的效率会更快。这个字节,相当于读一个int,cpu从内存读取了两次。

瞌睡的博客 1125

S7-1500 PLC与多台S7-200SMART PLC进行PROFINET通信的快捷方法

S7-1500 PLC与多台S7-200SMART PLC进行PROFINET通信的快捷方法

Robot_PLC_HMI_Automation 5687

OpenClaw-遇到的问题- FailoverError: Model context window too small (4096 tokens). Minimum is 16000

摘要:OpenClaw配置文件中deepseek-reasoner模型的上下文窗口被默认设置为4096 tokens(实际支持128K),导致系统报错"Model context window too small"。解决方案是删除配置文件中的contextWindow和maxTokens字段,让系统自动获取模型真实能力,并重启OpenClaw服务。配置文件通常位于用户目录下的.openclaw/openclaw.json中。

直到世界的尽头 4157

如何让struct不字节对齐

下面我们使用预编译指令#progma pack (value)来告诉编译器,使用我们指定的对齐值来取代缺省的。 #progma pack (2) /*指定按2字节对齐*/ struct C { char b; int a; short c; }; #progma pack () /*取消指定对齐,恢复缺省对齐*/ sizeof(struct C)值是8。 不字节对齐的...

kanwoerzi 826

OV9734 DATASHEET,完整规格书

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

C/C++ struct中字节对齐问题

标题C/C++中struct中字节对其问题 规则1: 结构体(struct)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员放在offset为该数据成员大小的整数倍的地方(比如int在32为机器为4个字节,则每个int变量都是从4的整数倍地址开始存储) 规则2: 如果一个结构体B里面嵌套另一个结构体A,则结构体A应从offset为A内部最大成员的整数倍的地方开始存储。(例如struct B里面有struct A, struct A里面有char, int, double等成员,那

qq_27198345的博客 748

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

visio安装包

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

[转载] Python: struct 模块之字节对齐问题

参考链接: Python中的struct模块 P y t h o n Python Python 在二进制写文件时,可以用 ...

u013946150的博客 552

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C/C++ 字节对齐问题

字节对齐的原因     为了提高 CPU 的存储速度,编译器会对 struct 和 union的存储进行优化,即进行字节对齐。 对齐方式     对于 struct 或 union 中的 struct 或者 union 来说,它们的字节对齐标准就是它的所有成员中字节数最大的数据的字节数。 一般情况下 C/C++ 的变量所占用的字节数         char:    1字节;     ...

amoscykl的博客 516

CC++ 字节对齐问题

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

questionhahaha的博客 495

比较:C++的struct和class、C和C++的struct

C++中的struct结构体和C语言中的struct结构体差异较大。C++中的struct结构体和C++中的class类极为相似。

han2205277149的博客 3190

C/C++语法知识:typedef struct 用法详解

第一篇:typedef struct与struct的区别 1. 基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。 在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。 至于typedef有什

Shirven 3万+

C语言struct字节对齐总结

最近不少同学开始找工作,很多关于C语言和C++的细节问题被重新揪出来称为热门话题。关于C语言里struct字节对齐的问题,网上查了一些结果,发现不是很全面(一般都没有关于struct里出现位字段时的总结),这里总结一下。

MulinB的技术博客 1643

C和C++中的struct

目录一文搞懂C和C++中struct1.C中struct2.C++中struct3.总结C和C++中的Struct区别C++中的struct和class的区别 一文搞懂C和C++中struct 1.C中struct 在C中struct只单纯的用作数据的复合类型,也就是说,在结构体声明中只能将数据成员放在里面,而不能将函数放在里面。 在C结构体声明中不能使用C++访问修饰符,如:public、protected、private 而在C++中可以使用。 在C中定义结构体变量,如果使用了下面定义必须加struc

自动驾驶行业学习、交流 4666

C/C++字节对齐

仔细讨论 C/C++ 字节对齐问题字节对齐的原因    为了提高 CPU 的存储速度,编译器会对 struct 和 union的存储进行优化,即进行字节对齐。对齐方式    对于 struct 或 union 中的 struct 或者 union 来说,它们的字节对齐标准就是它的所有成员中字节数最大的数据的字节数。一般情况下 C/C++ 的变量所占用的字节数        char:    1字节...

We_are_family678的博客 417

struct在c和c++中的区别

C语言中: Struct是用户自定义数据类型(UDT)。 c中的struct是没有权限设置的。 C中的struct只能是一些变量的集合体,可以封装数据却不可以隐藏数据,而且成员不可以是函数。 struct中间的某个类型(例如int)不可以直接初始化。 C++语言中: Struct是抽象数据类型(ADT),支持成员函数的定义。 C++中struct增加了访问权限,且可以和类一样有成员函数。 C...

土豆的博客 2414

C和C++中的struct有什么区别

转载自:https://www.cnblogs.com/chip/p/4955137.html struct 区别 在C 和C++ 中 C语言中: Struct是用户自定义数据类型(UDT)。 C++语言中: Struct是抽象数据类型(ADT),支持成员函数的定义。 在C++中,struct的成员的默认访问说明符为public,class为private。 ===================...

qq_36147009的博客 6557

C/C++中的Struct的理解

1.     struct的巨大作用 面对一个人的大型C/C++程序时,只看其对struct的使用情况我们就可以对其编写者的编程经验进行评估。因为一个大型的C/C++程序,势必要涉及一些(甚至大量)进行数据组合的结构体,这些结构体可以将原本意义属于一个整体的数据组合在一起。从某种程度上来说,会不会用struct,怎样用struct是区别一个开发人员是否具备丰富开发经历的标志。 在网络协议、通信

一克先生的专栏 1143

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

问题引入 定义一个结构体的一般形式为: struct 结构体名 { //类型说明符 成员名; }; 例如有如下结构体: struct Stu { int id; char sex; float hight; }; 那么一个这样的结构体变量占多大内存呢?也就是 cout<<sizeof(Stu)<&lt...

weixin_30412577的博客 1221

c/c++中的struct和class的区别

主要有两种情况: 1.C语言中的struct和c++中的class区别。 2.c++中的struct和c++中的class的区别。 下面分别介绍: 1.C语言中的struct和c++中的class的区别 C语言中的struct只能定义成员变量,不能够定义成员函数。如下所示: struct point { int x; int y; void print() ...

仗劍走天涯 2074
上一篇: 不用sizeof()求系统int型位数
下一篇: 各种位运算技巧
iMinder
博客等级 码龄16年 6粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值