c++ - union typedef 中的冗余字节

标签 c++ struct typedef unions

我使用以下结构来格式化 CAN 消息的数据。 messageData.ptr 用于进一步处理。该部分部分用于更好的访问。 问题是为什么在 messageData.srcSpecifier 和 messageData.data 之间多了两个字节

typedef union _MessagePureData_TypeDef
{
    signed int S32[1];
    unsigned int U32[1];
    unsigned short U16[2];
    signed short S16[2];
    unsigned char U8[4];
} messagePureData;

typedef union _MessageData_TypeDef
{
    unsigned char ptr[6];
    struct
    {
        unsigned char srcDevice;
        unsigned char srcSpecifier;
        messagePureData data;
    } section;
} messageData; 

示例:

messageData.section.srcDevice = 0xAA;
messageData.section.srcSpecifier = 0xBB;
messageData.section.data.U32  = 0x11223344;

messageData.ptr 包含的结果: [0xAA、0xBB、0x01、0x17、0x44、0x33]

那么 0x01 和 0x17 是从哪里来的??

最佳答案

对齐。
messagePureData 总是与 int 对齐,它可能有 4 个字节大。这意味着 section 肯定是对齐 8 个字节的,在 srcSpecifierdata 之间放置两个填充字节(因此整个结构体对象具有对齐方式) 8 和 data 4 之一)。另一方面,ptr 作为数组是连续的,因此它覆盖与两个填充字节相同的存储空间。

| ptr         | ptr + 1      | ptr + 2 | ptr + 3 | ptr + 4   | ptr + 5   |
|             |              |         |         |           |             
| srcDevice   | srcSpecifier | padding | padding | &data     | &data + 1 |   ... 

^                            ^                   ^
| Address is multiple of 8   |                   | Address is multiple of 4
                             |                   
                             | 
                             | Address is a multiple of two;
                             | Unfeasible address for data.

您可以打包结构来规避此问题。

关于c++ - union typedef 中的冗余字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27188455/

相关文章:

c++ - 如何使用方法返回指向对象结构的指针?

Golang 结构字段与 slice 语义 : "has a" slice of structs vs "is a" slice of structs

c - 释放 C 中零长度数组的已分配内存

c++ - 重复的 typedef - 在 C 中无效但在 C++ 中有效?

c++ - 获取继承基类类型的元组

c++ - 如何转发声明我将使用 typedef 创建的类型?

c++ - 参数列表中间的可变模板参数

c++ - 交换 DWORD 中的字节

c++ - 将对象从 vector 传递到另一个类

c++ - boost : persistent storage of R-trees?