关于struct的内存对齐问题

C++11新增关键字~alignas(struct对齐、sizeof、alignof) 本文记录alignas关键字,同时介绍alignof和sizeof. 阅读详情

内存对齐

1. 成员对齐:对于结构体的每个成员,起始地址的偏移量必须为该变量类型所占字节的整数倍。
2. 结构体对齐:结构体中占字节最多的成员叫边界成员,整个结构体所用空间必须是边界成员所占字节的整数倍。
3. 编译器的对齐指令:
通常不需要我们考虑对齐方式问题,编译器会自动选择合适的策略,但也可以通过命令设置:      
      *#pragma pack(n)*
 可以设定变量以n字节方式对齐。
 n字节对齐有两种情况:
      第一、如果n大于等于该变量所占字节数,那么偏移量必须满足默认的对齐方式。
      第二、如果n小于该变量的类型所占用字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。
 结构体总大小仍然要为占用空间最大的成员变量的倍数

为什么要内存对齐

 因为处理器读写数据,并不是以字节为单位,而是以块(2,4,6,8,16字节)为单位进行的,如果不进行内存对齐,本来只需要一次进行的访问,可能要好几次才能完成。

 例:若有结构体A如下定义
   struct A
     {
         char c;
         int i;
     };
 我们假设处理器一次从内存中取四个字节,显然没有经过内存对齐的话,要取两次才能得到i。当结构体足够复杂的时候,效率明显降低。

位域

 如果结构体中有位域,准则又要改变:
 1)如果相邻位域字段类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
 2)如果相邻位域字段类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,偏移量为其类型大小的整数倍
 3)如果相邻位域字段类型不同,根据编译器情况不同来决定结构体的大小
struct A
{
    char  c:2;
    int  i:4;
};
C++ struct、union、class内存对齐问题解析 C++ struct、union、class内存对齐问题解析前言struct、class与union内存对齐原则pragma pack(n) 前言 都不是很想将其归入到C++专栏,算了。 struct、class与union内存对齐原则 结构(struct)或联合(union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存 阅读详情

相关推荐

FreeCAD MCP实战:用AI自然语言驱动CAD建模与自动化

在计算机辅助设计(CAD)领域,参数化建模和自动化脚本是提升设计效率的核心技术。其原理在于通过程序化指令控制三维模型的创建与修改,从而将设计意图转化为精确的几何实体。这种技术价值在于显著降低重复性操作成本,实现快速原型迭代和设计探索。在应用场景上,它尤其适用于需要频繁调整尺寸、生成系列化零件或执行规则化建模任务的工程与产品设计。本文聚焦的FreeCAD MCP项目,正是这一理念的先进实践。它通过集成Model Context Protocol(MCP),构建了一个连接Claude AI与FreeCAD的智能

weixin_26913055的博客 723

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

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

fantasydreams的专栏 1058

关于基于Midas Civil API的二次开发——PyMiMi

现在写了第一条博客,希望是一个好的开始,能够每天抽出一两个小时或者更多的时间来写写代码,研究研究。我发现在我的工作中存在着大量的重复性工作,对于文档的开发是好办的,毕竟网上有现成库,只需要pip一下拿来用就好,但是对于Midas而言,在24版本之前官方都是没有一个可以使用的接口的,可能mct文件算半个?

ManiacsTraitor的博客 1850

三步解决C语言中struct字节对齐问题,Python进阶篇-struct字节对齐问题

Python进阶篇-struct字节对齐问题Python进阶篇-struct字节对齐问题Python调用C的时候,会传递一些复杂的数据结构,例如结构体,这时候就会遇到各种各样字节对齐的问题。下边所有的例子都是在windows 64bit下的结果。格式字符串说到这里我们就要来说一下python中的格式字符串,格式字符串顾名思义。就是一个字符串中的每一个字符代表一个数据类型。格式字符串由两部分构成,第...

weixin_39929961的博客 744

XC95144XL-10TQG144I Xilinx XC9500XL 高性能 CPLD

XC95144XL-10TQG144I 属于 Xilinx 的 XC9500XL 高性能 CPLD 家族,是一颗面向 3.3V 低电压系统的可编程逻辑器件。该器件以小封装、高速响应和良好的系统兼容性为设计目标,常用作系统控制/ glue-logic、I/O 缓冲、状态机、总线桥接与接口协议前端等场景中的可重编程逻辑单元。产品支持现场(in-system)编程与 IEEE-1149.1 JTAG 边界扫描,能在系统板上直接更新逻辑。

2403_90082736的博客 1060

利用makehumancommunity导入人体模型到COMSOL里(需要solidwork)

#makehumancommunity #solidwork #COMSOL

qq_41227634的博客 2158

struct结构体对齐问题

之所以struct结构体需要对齐的原因,大家都明白是为了提高寻址效率。看了很多资料和文章分析了结构体对齐问题,但是大多数要么讲的有错,要么讲的不清不楚,这里结合自己的分析和理解给出一个总结。 Part I 结构体中的成员可以是不同的数据类型,成员按照定义时的顺序依次存储在连续的内存空间。要弄清楚内存对齐,首先定义两个参数:内存偏移量和对齐参数。 (1)内存偏移量:内存偏移量指的是结构体变量中

holybin的专栏 2500

微信小程序|基于小程序+云开发制作一个菜谱小程序

今天吃什么?这是一个让强迫症左右为难的问题,跟随此文基于小程序+云开发制作一个菜谱小程序,根据现有食材一键生成菜谱,省心又省力。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 1万+

【C语言】(详细)结构体的内存对齐(规则、存在原因、默认对齐数的修改等+实例分析)

详细的c语言结构体内存对齐知识! ①结构体内存对齐规则 ②为什么存在结构体内存对齐 ③修改默认对齐数 ④结构体成员排序 ⑤实例分析

卜及中的博客 5391

包络检波电路(Envelope Detector)

把 100 kHz 载波想象成"电台的高频信号",把 1 kHz 包络想象成"主持人说话的声波"。而今天电路的工作,就是把这个"调大调小的外壳"(包络)重新剥出来,还原成主持人的声音 🎵。这是三极管开关电路的重要搭档,也是从"二极管家族"过渡到"三极管家族"的桥梁 🔌。——倍压整流看的是"幅值累积"(多个电容接力),包络检波看的是"频率分离"(高低频分开)。同样的"D1 串联 + RC 并联"拓扑,今天被赋予了"AM 解调"的新生命。——电感负载的"泄洪闸",保护三极管开关不被反向电动势击穿。

飞多学堂的博客 94

基于Spring Security 6的OAuth2 系列之二 - 客户端--非代码演示授权码模式

至此,我们就使用浏览器+postman工具演示了通过授权码模式去获取Gitee的用户信息。这过程中,我们只是遵循OAuth2的流程,就能够实现授权方法。那么接下来,我们采用代码方式来实现这个流程。

代码让AI扣 1813

Struct与Union以及内存对齐问题

主要区别 struct和union都是由多个不同的数据类型成员组成, 但在任何同一时刻, union中只存放了一个被选中的成员, 而struct的所有成员都存在。 在struct中,各成员都占有自己的内存空间,它们是同时存在的。一个struct变量的总长度等于所有成员长度之和。 在Union中,所有成员不能同时占用它的内存空间,它们不能同时存在。Union变量的长度等于最长的成员的长度。 对于u...

关关x雎鸠的博客 2170

提示工程架构师揭秘:prompt优化中的“隐性成本”如何控制?

当我们谈论Prompt优化时,往往聚焦于“效果提升”——比如让模型生成更准确的回答、更符合要求的格式。优化的本质是“成本-收益”的平衡。那些看不见的“隐性成本”,比如反复调试的时间消耗、复杂Prompt带来的认知负荷、长文本导致的系统资源浪费、后续维护的无穷麻烦,往往会在长期运营中成为压垮效率的“稻草”。本文将从提示工程架构师的视角,揭秘Prompt优化中的“隐性成本”到底是什么、如何量化,以及通过哪些工程化手段将这些“看不见的消耗”转化为“可控制的效率”。

操作系统内核探秘的博客 700

struct和union内存对齐问题

复合数据类型struct和union的内存对齐问题

qq_41936452的博客 269

温度PID控制PLC程序

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

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

struct内存对齐问题

步骤一:前面单元的大小必须是后面单元大小的整数倍,如果不是就补齐。步骤二:整个结构体的大小必须是最大字节的整数倍。确定一个结构体大小大致需要下面两个步骤即可。

MDtime的博客 180

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

struct成员的内存对齐问题:

1、自然对齐:及默认结构体变量成员中最大的长度设置为对齐字节 如: struct node { char a; int b; short c; };默认以最大长度int类型4字节对齐。此时占用内存为12byte 2、指定对齐 及 #pragma pack(n)  设置以n字节对齐 超出n字节长度默认以超出字节长度对齐 #pragma pa

3027

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

新发现 -- -struct 的内存管理 -- 4字节对齐问题

我们都知道,在 C 语言的 struct 结构体中,会存在 4 字节对齐的问题,就是为了能够快速地读取该结构的内存,提高访问速度。 但是,在 VS2008 和 Fedora14系统自带的 gcc 编译器中,编译如下的代码: struct A {  char i;  char j;  char x;  char y;  char z; }; int main(void) {

LC的专栏 1089

C/C++中关于struct内存对齐问题

http://blog.163.com/liurong063327@126/blog/static/864037152011914105819906/ 就这篇写的清晰明了。做如下总结: 1、对齐值如何计算 ① 如果没有指定对齐值,则对齐值为成员变量中最大的那个值。 ② 如果指定的对齐值(#pragam pack(value)// 2,4,6,8....),则对齐值为

没有什么能够阻挡,我对自由的向往! 1265

关于struct和union存储的内存字节对齐的问题

这是在读winnt.h头文件的源代码时发现了一段自己弄不明白的代码,继而牵扯到了结构体存储的内存边界对齐的问题。该问题在MSDN中说的比较少。以下是阅读MSDN中的一些重要信息:1.可以使用 #pragma pack 指令来指定对齐字节,该指令指定内存对齐字节的功能和编译器选项 /Zp 是等效的。2.#pragma指令对该指令之后的 struct 或 union 的声明有效。如果把这条指令

jcwKyl的专栏 4342

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

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

weixin_30412577的博客 1221

gcc 中结构体(struct)内存对齐问题分析

每个特定平台的编译器都有一个默认的对齐系数,gcc中是4,VC中貌似是8。也可以通过于编译命令#pragma pack(n)来指定该系数,其中n的值经测试只能是1,2和4. 对齐规则: 1、结构体的第一个数据成员放在相对位置为0的地方,以后每个数据成员按#pragma pack(n)中n指定的值和该数据成员自身长度中比较小的那个进行对齐。 2、数据成员完成对齐后,结构体本身也要对

天朝高官的专栏 3334

Net的struct的内存对齐问题

很少有人谈起struct的内存对齐问题, 就是在很多C#书中, 也很少提及. 但在实际应用中, 如果不注意内存对齐, struct比较大的话, 则会浪费一定的内存.先从一个实例看起.public unsafe struct MyStruct1{byte b;string s;int i;char c;}在这个struct中, 各个成员的字节数为, b...

weixin_30451709的博客 100

C++:struct和union 内存字节对齐问题

struct内存对齐问题 1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。 2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有s...

ym & blog 281
上一篇: 常见的进程调度算法
下一篇: 浅谈大端模式和小端模式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值