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 ++结构对齐兼容性问题