深入理解内存对齐

GPD源码分析 gpd使用示例 先看下面一段代码,为标准gpd算法的使用方法,可以看到输入为点云,cloud_camera_; 输入:std::unique_ptr<gpd::util::Cloud> cloud_camera_ 输出: std::vector<std::unique_ptr<gpd::candidate::Hand>> grasps; // detect grasp poses gpd对象:std::unique_ptr<gpd::GraspDetect. 阅读详情



内存对齐”应该是编译器的“管辖范围”。编译器为程序中的每个“数据单元”安排在适当的位置上。但是C语言的一个特点就是太灵活,太强大,它允许你干预“内存对齐”。如果你想了解更加底层的秘密,“内存对齐”对你就不应该再透明了。


对齐原因


1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。


对齐规则


每个特定平台上的 编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过 预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。
规则:
1、 数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐 按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将 按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
3、结合1、2可推断:当#pragma pack的n值等于或超过所有 数据成员长度的时候,这个n值的大小将不产生任何效果。

#pragma pack(n)


编译器中提供了#pragma pack(n)来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始地址的偏移量有两种情况:第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式,第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。结构的总大小也有个约束条件,分下面两种情况:如果n大于所有成员变量类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数;否则必须为n的倍数。

n:可选参数;指定packing的数值,以字节为单位;默认数值是8,合法的数值分别是1、2、4、8、16。


代码示例

使用默认##pragma pack(n)

#include <iostream>
using namespace::std;
//#pragma pack (n)
class Csize{
        public:
                int x;
                char y;
                void print();
};

void Csize::print()
{
         cout << sizeof(Csize) << endl;
}

int main(int argc,char *argv[])
{
        Csize a;
        a.print();

        return 0;
}

此时输出结果为8,即类Csize的长度为8。当程序未设定#pragma pack (n)时,默认n=8,即编译器执行8字节对齐。而类中最大数据元素为int型,占4个字节,此时执行较小的,也就是4字节对齐方式。类Csize中其他类型,如本例中的char类型只有1个字节,在执行4字节对齐的情况下,后面两个字节自动补齐(1+3),不添加任意数据。所以类Csize长度为4+(1+3)=8。

使用#pragma pack (2)

#include <iostream>
#pragma pack(2)
using namespace::std;

class Csize{
        public:
                int x;
                char y;
                void print();
};

void Csize::print()
{
         cout << sizeof(Csize) << endl;
}

int main(int argc,char *argv[])
{
        Csize a;
        a.print();

        return 0;
}

此时输出结果为6。由于#pragma pack (2),设定n=2,编译器执行2字节对齐。此时int型被拆分成两个部分,均为2字节,而char型本身为1字节,但是自动补全1个字节。所以2+2+(1+1)=6,即类Csize的长度为6。

注意:#progma pack (n)中,n只能取合法的计算机数值,即2^n。否则会出现警告,如:warning: alignment must be a small power of two, not 3 [-Wpragmas]


Dify+MCP Server打造禅道AI智能助手 Dify AI与MCP Server结合打造的禅道AI智能助手,实现了项目管理智能化升级。该方案通过大语言模型和自动化工作流,提供四大核心功能:1)自动化报表生成,支持多维度数据统计与可视化;2)禅道系统管理操作,简化产品/项目/任务管理流程;3)基于知识库的智能问答系统;4)数据库灵活查询与可视化输出。系统采用分层架构,通过MCP协议实现AI与数据源解耦,解决了传统禅道在数据孤岛、工具碎片化等问题。实际应用验证了其在用户管理、任务创建、Bug处理等场景的高效性,显著提升了项目管理效率。 阅读详情

相关推荐

Android开发者必看:5分钟搞定MQTT客户端连接EMQX服务器(附完整代码)

本文为Android开发者提供了一份快速实现MQTT客户端连接EMQX服务器的实战指南。通过引入Eclipse Paho SDK,详细讲解了从项目配置、权限申请到核心连接、主题订阅与消息发布的完整流程,并附有即拿即用的Kotlin代码,帮助开发者在物联网应用中高效集成轻量级实时通信功能。

weixin_29228781的博客 271

C语言——结构体大小计数方法(结构体对齐)

目录 一、结构体计算方法(规则) 二、对其方式浪费空间? 二、例子 #pragma pack() 结构体的大小不是成员类型大小的简单相加。需要考虑到系统在存储结构体变量时的地址对齐问题。 一、结构体计算方法(规则) 由于存储变量地址对齐的问题,结构体大小计算必须满足两条原则: 1.结构体成员的偏移量必须是成员大小的整数倍(0倍认为是任何数的整数倍) 2. 结构体大小必须是所有成员大小(数组,结构体除外)的整数倍。(结构体声明不算进去,但定义了变量就算进去) 二、对其方式浪费空间? 浪费,

小伟的博客 520

汽车软件工程师必看:ASPICE流程实战指南(附完整产物清单)

本文为汽车软件工程师提供ASPICE流程实战指南,详细解析如何搭建合规开发环境、各阶段文档产出清单及工具链整合策略。通过实战案例和模板资源,帮助团队高效实施ASPICE标准,提升软件开发质量与效率。

weixin_29230805的博客 470

C语言结构体字节对齐(内存对齐)之#pragma pack和__attribute__((packed)的使用

在不使用和本文主要讨论如何使用#pragma pack和__attribute__((packed)等选项来自定义字节对齐大小。使用pack功能将数据结构进行打包,以减小应用程序对内存的占用,这一点在嵌入式系统中,尤其是需要存储和访问大量的时候,显得尤其重要。如果没有使用#pragma pack和__attribute__((packed)等选项,将数据结构进行打包。编译器为了提高对数据成员的访问速度,通常会在不同大小的数据成员之间插入空白内存(padding),进行补齐操作,即内存对齐。

DayDayUp 1万+

已过tiktok校招客户端,面经分享

面试的话, 一天面完3面, 效率很高, 三天之后就发了offer 字节邮件里面也说了不能泄露面试题, 那我就把我秋招参与美团,字节,腾讯,阿里面试被问到的全部问题总结着写出来了, 这其实是我每一轮面试完之后我都会总结哪里答对了, 哪里没有答对, 总结了一大堆问题出来. 答案未必正确, 我只是给自己写了个简单的一句话概括, 可能不够完善, 建议看官自行回答一下这些问题 二本非科班, 暑假在字节实习过, 不过不是tiktok部门, 因此秋招就没啥时间准备面试了, 只投了几个大厂, 顺便也在字节跨部门转正,

a1472750149的博客 1307

SAP FICO 消息号 FAA_POST042 技术清算科目中的余额:分类账 0L,货币 00、RMB、10000.00-

SAP FICO 消息号 FAA_POST042 技术清算科目中的余额:分类账 0L,货币 00、RMB、10000.00-

我好像病了的博客 2138

struct成员对齐小解

转载请加注:Qdieyou 修正:2007年5月20日注:以下理论只供参考,建议使用前使用sizeof来进行测试。谢谢!先来看一段代码:struct A {    short a;    long b;};struct B {    char c;    struct A s1;    short d;};struct C {    char c;    char a;    int b;};in

败中求胜——Qdieyou个人工作室 1701

Adams软件安装与配置全攻略:从入门到机器人仿真

机械系统动力学仿真软件Adams是工业机器人开发的重要工具,其安装过程涉及许可证配置、环境变量设置等关键技术环节。专业仿真软件安装通常需要处理系统兼容性、组件依赖和授权验证等工程问题,特别是在机器人控制仿真等场景中,还需集成MATLAB/Simulink等第三方工具。本文以Windows平台为例,详解Adams安装的核心步骤,包括系统环境检查、许可证服务器配置、工业机器人专项模块安装等实践要点,并针对NVIDIA Quadro显卡优化、27500端口通信等常见问题提供解决方案,帮助用户快速搭建可靠的仿真环境

weixin_28523493的博客 199

alignment must be a small power of two, not 12

#pragma pack(12)//对齐不能不能是12,应该是2的平方数 转载于:https://www.cnblogs.com/vcyuyan/articles/1747252.html

anquankuai6734的博客 710

KEPServerEX作为MQTT客户端

打开软件: 测试没有连接上MQTT代理。

低码开发 1681

手势识别器:实现手部动作识别器

在本篇文章中,我们将使用Python来实现一个简单的手部动作识别器。然后,我们通过循环从摄像头获取每一帧图像,并对每一帧图像进行处理。我们提取手部关键点并计算手势的特征向量,然后将其添加到特征列表和标签列表中。接下来,我们再次从摄像头获取每一帧图像,并进行手势识别。我们提取手部关键点并计算手势的特征向量,然后使用训练好的分类器来预测手势,并在图像上显示出来。在这个实现中,我们将使用MediaPipe库来检测和跟踪手部关键点,然后使用K最近邻(K-Nearest Neighbors)算法对手势进行分类。

BitSlinger的博客 238

嵌入式Linux C语言(六)——内存字节对齐

嵌入式Linux C语言(六)——内存字节对齐一、内存字节对齐简介1、内存字节对齐计算机中内存空间都是按照字节划分的,从理论上讲对任何类型的变量的访问可以从任何地址开始,但是在程序实际编译过程中,编译器会对数据类型在编译过程中进行优化对齐,编译器会将各种类型数据按照一定的规则在空间上排列,而不是顺序的排放,这就是内存字节对齐。2、内存字节对齐原因不同硬件平台对存储空间...

weixin_34261415的博客 555

SAP 发票凭证反向冲销

发票凭证反向冲销: 业务模拟: MIRO发票校验后,生成发票凭证号: 事务代码MR8M,输入凭证号码,反向冲销(类似于MIGO入库后的反向冲销): 此时进入MIRO查看,发现冲销成功,可以再次做MIRO发票校验: ...

willieyuan的博客 7708

计算机内存地址对齐,深入理解内存对齐

从底层来说,计算机访问内存的两种方式:从为word_size(比如32位或者64位)的倍数的地址开始,1. 读取长度为word_size的内存块的数据,或者2. 把长度为word_size的数据写入内存。这里有两个“天性”【注释1】:1. 读/写总是从word_size的倍数的地址开始的(wikipedia上Data Structure Alignment词条独独少了这条至关重要的说明,虽然从其上...

weixin_39631017的博客 1282

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C筑基——深入理解内存对齐

11月份的时候,同事维护的项目出现了内存对齐问题:传递数据的一方使用了修改了结构体的对齐方式,而接收方数据的一方并没有对这个结构体使用同样的对齐方式,造成了获取数据时失败的问题。为什么要有内存对齐?内存对齐原则如何修改默认对齐方式?本文到这里就草草结束了,虽然有些啰嗦,但是还是希望可以帮助到大家。

willwaywang6 1795

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

深入理解 Visual Studio 中的内存对齐

通过上面的详细分析和代码示例,我们了解了在 Visual Studio 中内存对齐的重要性以及如何使用指令来灵活控制结构体的内存对齐方式。在实际编程中,根据具体的需求合理地选择内存对齐方式,可以在一定程度上优化内存占用以及提高程序运行效率。不过需要注意的是,过度追求紧凑的内存对齐可能会牺牲一些 CPU 访问数据的效率,所以需要在不同的应用场景下进行权衡和测试。希望这篇博客能够帮助大家更好地理解 Visual Studio 中的内存对齐相关知识,在今后的 C/C++ 编程中更加得心应手。

DoctorDragon的博客 1382

温度PID控制PLC程序

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

《深入理解计算机系统》数据在内存中的对齐方式

前言 本部分内容是根据《深入理解计算机系统》这本书以及慕课网上南京大学袁春风老师的《计算机系统基础》课程,并针对豆瓣上《深入理解计算机系统》使用指南书评里面的应试内容进行的总结。 数据在内存中的对齐方式 ...

漏网小鱼的博客 898

深入理解C/C++内存对齐

引用:http://www.jb51.net/article/45406.htm 内存对齐,memory alignment.为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访问。 内存对齐一般讲就是cpu access memory的效率(提高运行速度)和准确性(在一些条件下

漫游学海之旅 746

C语言之深入理解内存对齐

C语言之深入理解内存对齐

weixin_65743593的博客 576

带你深入理解内存对齐最底层原理

相信绝大多数的人都了解内存对齐,对齐后性能高。但是其最最底层的原理是啥呢? 有的人可能会说,因为高速缓存的工作机制。读者你很聪明,这是原因之一。但我今天想挖的是更底层一点的原理,让我们去内存的物理构成里找找答案! 内存物理结构 我们来了解一下内存的物理构造,一般内存的外形图片如下图: 图1 内存外形图 一个内存是由若干个黑...

zhangyanfei01的专栏 576

Linux 对齐内存分配,关于linux:带你深入理解内存对齐最底层原理

置信绝大多数的人都理解内存对齐,都晓得变量应该按8字节去对齐,这样性能高。然而其最最底层的原理是啥呢? 有的人可能会说,因为高速缓存是以8字节为单位进行的。读者你很聪慧,这是起因之一。但我明天想挖的是更底层一点的原理,让咱们去内存的物理形成里找找答案!内存物理构造后面咱们说过内存是由chip形成。每个chip外部,是由8个bank组成的。其结构如下图:而每一个bank是一个二维立体上的矩阵,后面文...

weixin_29124947的博客 407

深入理解内存对齐:从原理到实践

内存对齐是一种为了提高程序性能而优化内存访问速度的技术。现代计算机的CPU并非以字节为单位访问内存,而是以字长(word size)为单位(如32位系统是4字节,64位系统是8字节)进行存取。当所需数据的内存地址正好是它的长度的整数倍时,CPU的访问效率最高。这就是自然对齐(Natural Alignment)。例如,一个4字节(32位)的int型变量,其起始地址最好是4的倍数。如果一个变量的存储没有遵循其对齐要求,可能会引发性能下降,甚至在某些架构(如ARM、SPARC)上导致硬件异常。

2301_78085749的博客 1793

深入理解C语言内存对齐

http://www.jb51.net/article/44221.htm 这篇文章主要介绍了C语言内存对齐,有需要的朋友可以参考一下 一.内存对齐的初步讲解 内存对齐可以用一句话来概括: “数据项只能存储在地址是数据项大小的整数倍的内存位置上” 例如int类型占用4个字节,地址只能在0,4,8等位置上。 例1: 复制代码 代码如下: #incl

247

深入理解C语言内存对齐与位域机制

通过实例解析C语言中结构体内存对齐的规则及其背后的性能与平台原因,探讨#pragma pack、attribute等控制对齐方式的方法,并结合位域讲解如何高效利用内存空间,帮助掌握底层数据布局。

weixin_42601134的博客 848
上一篇: 双向链表的创建查找与删除元素
下一篇: 自主编写程序实现strcmp函数功能
FreeeLinux
博客等级 码龄11年 421粉丝 356原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值