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)

参考链接:

1. C语言结构体与字符数组间的相互转换

2. C语言 struct强转char*不会出问题吗?

3. __attribute__((packed))详解

4. 关于android:Clang和Visual C ++结构对齐兼容性问题

原文地址:https://www.cnblogs.com/yongdaimi/p/14041419.html