android: 取消编译过程中的结构体对齐
昨天遇到了一个场景,需要拷贝整个结构体的内容,既然是拷贝结构体的内容,那就一定要知道结构体的长度。一般而言,直接使用sizeof(struct xxx)就好了,但是考虑到内存对齐的问题,通过sizeof(struct xxx)拿到的实际上是结构体实际占用的内存空间大小。所以一旦编译器做出了优化,再把sizeof得出来的值作为memcpy的参数的话,肯定是有问题的。
后来Google一下,其实android下是有相关的参数能够让编译器不去对结构体做内容对齐的:
typedef struct __attribute__((__packed__)) ID3_HEADER { uint8_t id3_Identifier[3]; uint16_t id3_Version; uint8_t id3_Flags; uint32_t id3_Size; } ID3_HEADER_t;
重点就是 __attribute__((__packed__)) 这个属性,不加这个属性的话,通过sizeof(ID3_HEADER_t) 求得的长度为12, 但是加了这个属性,再用sizeof(ID3_HEADER_t) 求长度的话,长度就是结构体成员的长度之和了,就是10。
另外:微软的 Visual Studio 下其实也有类似的属性参数:
#pragma pack(push, 1) // 以1个字节进行对齐 struct Test { char a; char b; double d; }; #pragma pack(pop)
参考链接:
4. 关于android:Clang和Visual C ++结构对齐兼容性问题
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
2019-11-26 libusb: android上集成libusb库
2018-11-26 android studio - No compatible file types found
2016-11-26 新浪微博客户端(41)-切换表情键盘
2016-11-26 新浪微博客户端(40)-使用AFN发送带图片的微博