关于内存对齐

Golang的内存对齐 Golang的内存对齐测试demo:内存对齐为什么要关心对齐为什么要做对齐默认对齐系数成员对齐:整体对齐对齐规则分析流程成员对齐整体对齐结果小结巧妙的结构体分析流程成员对齐整体对齐结果总结 测试demo: 我们先来看一个demo: type Part1 struct { a bool b int32 c int8 d int64 e byte } 我们先来看一下Part1里面的各个数据... 阅读详情
 曾经接手一个网络视频监控程序,主要是上层软件通过 发送控制指令获取网络视频板的视频数据和控制网络 视频板, 这应该是一个比较简单的流程!
一切的开发都很顺利,测试的时候,问题就来了,获取视 频数据流的数据竟然是错误的,我糊涂了,把整个程序 流程,用调试器一步一步地跑,到了发送视频指令的时候,返回 指令操作错误的结果,怎么回事?
我是按照视频的操作指令封装的数据包,内存显示数据 包的内容是没有错误的,就是一个晚上,我不停地找"错 误",只有偶然,我把sizeof()这个指令直接换掉,把数据包全 部用一个BYTE的数据进行copy,程序成功执行!这时,我 已经快晕了!
数据发送到网络板的数据包大小根本不是实际控制数 据包的大小!
这时我才想起一个人, Stanley B. Lippman,他写的那 一本书 "Inside object modale", 曾经提过这样的事 情,编译器为了提高CPU的效率,会对struct 的结构进行优化, 利用sizeof 可以得出不同的计算机上对 struct 的结 构优化后的大小值.以前是看过,但是,却没有深刻理会,现在,吃了 苦头,才明白!
这是我的理解,C++ 编译器为了使CPU的性能达到最佳, 会对 struct 的内存结构进行优化,这是为了达到CPU 数据传输总线的吞吐值,各个计算机的数据传输总线是不一样的, 如32位的计算机的数据传输值是4 bytes,64位计算机 数据传输是 8 bytes,这样,struct 在默认的情况上,编译器会对 struct 的结构进行数据对齐((32位机)4的倍数或(64 位机)8的倍数),如下面这段代码所示:
#include 

typedef struct tagPACKAGE {
	int 	intValue;
	char	chValue1;
	char	chValue2;
} PACKAGE, * LP_PACKAGE;

int main()
{
	PACKAGE package;
	
	std::cout << "sizeof( package ) = " << 

sizeof( package ) << std::endl;

	return 0;	
}


程序执行结果为 8 ( sizeof( int ) + sizeof( char ) + sizeof( char ) + 对齐值 )为8. (我的机子是32 位,4*2=8)一切都是编译器搞得自已头晕,但是为什么以前自已写的网 络程序没有这种情况?同样的数据包传输,我并没有阻 止编译进行强制对齐,我猜可能是操作系统都是一样(都是WinX系统)的才 没有出现问题,而现在的网络视频板是内嵌式linux,对 数据包的处理是纯数据(不经对齐的数据)是敏感的所以,才会出现这样 的问题! 这种情的解决方法是阻止编译器对数据包对齐,因为数 据对齐的时候,编译器会塞入一些没有意义的数据对结 构进行对齐,使用 #pragma 强制编译器产生指定数据对齐方式,如下代码 所示
#pragma pack(push)
#pragma pack(1)
typedef struct tagPACKAGE {
	int 	intValue;
	char	chValue1;
	char	chValue2;
} PACKAGE, * LP_PACKAGE;
#pragma pack(pop)

typedef struct tagPACKAGE2 {
	int 	intValue;
	char	chValue1;
	char	chValue2;
} PACKAGE2, * LP_PACKAGE2;

int main()
{
	PACKAGE package;
	PACKAGE2 package2;
	
	std::cout << "sizeof( package ) = " << 

sizeof( package ) << std::endl;
	std::cout << "sizeof( package2 ) = " << 

sizeof( package2 ) << std::endl;

	return 0;	
}


对指定的数据包编译时进行内存对齐,这样,也不会对 编译对其数据进行优化!
总结:
C++的编译器总是在背后做了很多事!网络数据处理或 与内嵌式设备打交道的时候,这更应该小心!
内存对齐的理解 一、内存对齐物理层面的理解 内存物理结构 我们来了解一下内存的物理构造,一般内存的外形图片如下图: 一个内存是由若干个黑色的内存颗粒构成的。每一个内存颗粒叫做一个chip。每个chip内部,是由8个bank组成的。其构造如下图: 而每一个bank是一个二维平面上的矩阵,矩阵中每一个元素中都是保存了1个字节,也就是8个bit。 内存编址方式 那么对于我们在应用程序中内存中地址连续的8个字节,例如0x0000-0x0007,是从位于bank上的呢?直观感觉,应该是在第一... 阅读详情

相关推荐

Cursor+Playwright MCP实战:如何用自然语言一键生成UI自动化测试脚本

本文探讨了如何利用Cursor与Playwright MCP实现自然语言驱动的UI自动化测试脚本生成。通过智能IDE与浏览器自动化协议的结合,开发者可以高效创建稳定的测试脚本,显著提升测试效率与维护性。重点介绍了MCP架构的优势、项目结构最佳实践及团队协作规范,为自动化测试带来革命性改进。

k8l9m0n的博客 440

shared_ptr详解

最近遇到了智能指针shared_ptr,发现对其并不是很了解,所以参考了几篇博客,特此新写一篇进行总结一下。由于C++标准库已经将std::shared_ptr引入,而且和boost::shared_ptr区别不大,所以并没有对参考的博客进行区分。介绍boost库中对shared_ptr说明:An enhanced relative of scoped_ptr with reference coun

xjc200808的专栏 1936

USB3.0/3.1信号完整性分析仿真

• 1.了解USB3.0通路的互连关系,解读原理图接口电路和PCB的互连电路。对USB布线的通路及阻抗进行检查和分析。 • 2.使用USB3.0实例文件提取互连线的S参数,选择SSRX+,SSRX-,SSTX+,SSTX-,D+,D-组的互连线,使用PowerSI,Clarity,3DFEM等工具提起关键网络的S参数。提取S参数以后需要分析S参数的互连特征,对S参数的结果开展评价。 • 3.使用SYSTEM SI USB3 Compliance工程向导模型,建立USB仿真实例框架,在框架BOLCK中带入S参

小猪配齐电子设计 1万+

内存对齐、内存对齐规则解释、内存对齐原理

一、内存对齐的原因 我们都知道计算机是以字节(Byte)为单位划分的,理论上来说CPU是可以访问任一编号的字节数据的,我们又知道CPU的寻址其实是通过地址总线来访问内存的,CPU又分为32位和64位,在32位的CPU一次可以处理4个字节(Byte)的数据,那么CPU实际寻址的步长就是4个字节,也就是只对编号是4的倍数的内存地址进行寻址。同理64位的CPU的寻址步长是8字节,只对编号是8的倍数的内存...

草帽~小子^的博客 7393

开源网格划分软件-Gmsh二次开发教程 (4)网格生成与控制​

​本章将深入讲解Gmsh的网格生成技术,包括全局/局部网格控制、边界层生成、自适应细化等,并提供完整的代码示例。

ZQGG的博客 1472

手把手教你用Gazebo插件实现阿克曼底盘仿真(附Navigation2适配指南)

本文提供了一份完整的ROS2 Navigation2与Gazebo阿克曼底盘仿真全栈指南。从阿克曼运动学原理出发,详细讲解了如何构建URDF/SDF模型、集成gazebo_ros_ackermann_drive插件并进行PID调优,并重点阐述了如何深度适配Navigation2,包括配置Ackermann运动模型、调整规划器与恢复行为,最终实现从建图到自主导航的全流程仿真。

weixin_29310631的博客 398

详解内存对齐

欢迎大家点击上方文字「Golang梦工厂」关注公众号,设为星标,第一时间接收推送文章。前言哈喽,大家好,我是asong。好久不见,上周停更了一周,因为工作有点忙,好在这周末闲了下来,就赶紧...

qq_39397165的博客 2万+

利用Python爬虫采集京东商品评论情感分析案例(含完整代码)

在电商蓬勃发展的今天,商品评论蕴含着巨大的商业价值。本文以京东商品评论为研究对象,系统介绍如何使用Python构建一个完整的评论采集与情感分析系统。文章涵盖京东反爬机制分析、动态请求模拟、评论数据解析、中文文本预处理、基于SnowNLP和深度学习的情感极性分类、以及可视化展示等完整技术链路。所有代码均基于2025-2026年最新可用接口编写,并提供可直接运行的完整源码。全文力求详实,总字数逾八千字,适合Python数据分析从业者、电商运营人员及自然语言处理初学者参考实践。目录摘要第一章 引言。

2201_76125261的博客 87

C++ 内存对齐

二、内存对齐规则 首先了解两个概念: 1.每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。32位系统,gcc中默认#pragma pack(4),可以通过预编译命令#pragma pack(n),n = 1,2,4,8,16来改变这一系数。 2.有效对齐值:是给定值#pragma pack(n)和结构体中最长数据类型长度中较小的那个。有效对齐值也叫对齐单位。 然后明确内存对齐的两个规则: 1.结构体第一个成员的偏移量(offset)为0,以后每个成员相对于结构体首地址的 off

weixin_43816121的博客 4904

27、目标识别的最新进展

本文综述了目标识别(OID)领域的最新进展,重点介绍了质量评估、预处理和搜索空间缩减等关键技术。文章分析了多种质量指标,如缩减率、对完整性、召回率和精确率等,并探讨了它们的适用场景。同时,详细介绍了预处理中自动学习转换规则的方法,以及传统阻塞、排序邻域索引等搜索空间缩减技术。此外,文章还讨论了动态选择缩减技术的方法,并展望了未来研究方向,如更智能的预处理、自适应的缩减技术和与人工智能的结合。希望这些技术和方法能够为目标识别领域的研究和实践提供参考和帮助。

q5r6s7的博客 91

网络工程师软考通关指南:网络新技术与应用深度解析

网络安全与管理是网络工程师必须掌握的核心技能,华为设备在企业网络中广泛应用。建议考生在理解安全原理的基础上,重点掌握华为特有的命令体系和配置方法,通过模拟实验加深理解。下篇文章将深入讲解"网络优化与QoS"章节,涵盖流量调度、拥塞避免、服务质量等关键技术,敬请期待。

Programming Talk 252

什么是内存对齐以及作用

什么是内存对齐? 为了解释这个问题,先来介绍下面的例子: #include<iostream> using namespace std; struct A { char a; short b; int c; }; struct B { short b; int c; char a; }; int main() { cout<<sizeof(A)&...

qq_41909314的博客 6096

FANUC机器人_CRX协作机器人的开机和示教器的初始化设置基本步骤(二)

FANUC机器人_CRX协作机器人的开机和示教器的初始化设置基本步骤

Robot_PLC_HMI_Automation 2732

什么是内存对齐

内存对齐

qq_42376419的博客 1535

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

结构体内存对齐

int a;char b;char c;char b;int a;char c;思考一下node1和node2的大小分别为多少?我是在 Windows 下 MinGW32 的 GCC 测试的一样的成员属性,但node1只有 8K,而node2的大小却有 12K。由此可见,结构体对齐,实质上就是内存对齐。

Projectsauron 的博客 2万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

内存对齐以及如何关闭内存对齐

内存对齐以前接触过,知道有这么回事,昨天面试,面试官问了一个结构体内存分配相关的问题: struct _A{ int a; int b; char c; }A; sizeof(A)=?(32位机器) 我一想这要涉及到内存对齐啊,sizeof(A)=12 啊, 没想到接下来面试官的一个问题就是:那如果我想节省内存,不让他内存对齐,就分配9个字节,怎么办? 当时就蒙了,一直没想过这个

a1205137569的博客 4358

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

关于内存对齐的那些事

Wrote by mutouyun. (http://darkc.at/about-data-structure-alignment/) 1. 内存对齐(Data Structure Alignment)是什么 内存对齐,或者说字节对齐,是一个数据类型所能存放的内存地址的属性(Alignment is a property of a memory address)。 这个属性

云彩挂上的二叉树 1万+

C语言 | 内存对齐01 - 什么是内存对齐

一、前言 在单片机下使用C语言编程时,内存对齐的知识点必须掌握。掌握内存对齐后,可以防止内存碎片化,单片机有限的内存被更加有效地使用。 二、内存对齐 先看如下代码: 结构体Test1占用了多少字节?如果事先不知道内存对齐的话,答案肯定是:1个字节(char)+ 4个字节(int)+ 1个字节(char) = 6个字节。 事实上,Test1结构体占用了12个字节,从DEBUG模式下Watch1观察: OK,不就猜少了12个字节吗?有什么影响吗?先不说影响吧,咱们先来看看单片机内存里的实际情况。从上图看

wallace89的博客 2681

为什么要内存对齐

当我们听到”内存对齐“这个概念时,从字面意思来看,很容易理解。那就是让内存对齐。        当然  就会有人说  你这不是废话 ??         现在我就来说一说为什么要内存对齐以及怎么个对齐法(如何对齐)?        首先来谈谈什么叫内存对齐!!我百度了一下如下解释: 内存对齐:       内存对齐”应该是编译器的“管辖范围”。编译器为程序中的每个“数据单元”安排在适当的

土豆的博客 8767

内存对齐

内存对齐 内存对齐”应该是编译器的“管辖范围”。编译器为程序中的每个“数据单元”安排在适当的位置上。 对于内存对齐问题,主要存在于struct和union等复合结构在内存中的分布情况,许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们要求这些数据的首地址的值是某个数M(通常是4或8);对于内存对齐,主要是为了提高程序的性能,数据结构,特别是栈,应尽可能在自然边界上对齐,经过对齐后,cpu的内存访问速度大大提升。 Windows中默认对齐数为8,Linux中默认对齐数为4; 内存对齐的主要作

GoodLinGL的博客 1718

什么是内存对齐?内存对齐的原则?为什么要进行内存对齐,有什么优点?

是指在计算机中,为了提高内存访问效率,数据在内存中的存储地址需要满足特定的对齐要求。不同的数据类型(如intfloatdouble等)在内存中的存储地址往往有特定的对齐边界,通常是该数据类型大小的倍数(比如int通常对齐到 4 字节,double通常对齐到 8 字节)。

weixin_47151388的博客 2345

内存对齐原则

内存在使用过程并不是单一的依次排列,而是按照某种既定的规则来进行对齐,以方便快速访问.内存的对齐原则有以下三条: 数据成员对齐:成员根据其自身大小,从自身大小的整数倍内存地址(以第一个元素存储在0位置为参考)开始存储; 结构体成员对齐:如果包含了结构体成员,则结构体成员的存储位置从其内部成员最大值的整数倍地址开始存储; 结构体总大小对齐:必须要是其内部最大成员的整数倍,不足的要补齐. 注:以...

王二东的博客 3123

【golang】内存对齐

在访问特定类型变量的时候通常在特定的内存地址访问,这就需要对这些数据在内存中存放的位置有限制,各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。内存对齐是编译器的管辖范围。表现为:编译器为程序中的每个“数据单元”安排在适当的位置上。

m0_53328239的博客 1474

小心内存对齐

什么是内存对齐?CPU在读取内存地址的时候,一定按照一定的偏移量去读取,不知道你发现了没有,我们没有看到一个变量的大小是 3 个字节的,都是 1 个字节,2个字节,4个字...

嵌入式Linux 1178
上一篇: 内存映射修改大文件
下一篇: 软件测试悖论
ShenRui
博客等级 码龄20年 63粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值