为什么这个Union占用2个字节,即使我正在对齐一个

时间:2016-05-25 17:00:54

标签: c

我正在为LCD hitachi显示器并行端口连接建模(对于那些感兴趣的HD44780,在4位模式下)。

即使对齐设置为1,此联合仍占用2个字节。如果我摆脱了msnibble结构(直接将db4放到了union中的结构中的db7),它占用了1个字节。如果它们在一个联合内部,那么结构会占用不到1个字节吗? 2个字节是msnibble占用1个字节加上半字节(使能位,rs位和两个空白位)的结果,从而使大小为2个字节?

以下是代码:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

typedef uint8_t byte_t;//could have used char

#pragma pack(push,1) 
typedef union
{
    byte_t  whole_port  :8;
    struct
    {
        byte_t enable       :1;
        byte_t rs           :1;
        byte_t              :1;
        byte_t              :1;
        struct 
        {
            byte_t db4          :1;
            byte_t db5          :1;
            byte_t db6          :1;
            byte_t db7          :1; 
        }msnibble;

    };
} para_port_t;
#pragma pack(pop)

int main(int argc, char** argv) {
    printf("%u\n",sizeof(para_port_t));
    return (EXIT_SUCCESS);
}

我正在使用gcc编译ubuntu中的netbeans。由于pragma是一个编译器指令,我想知道它是否在Microsoft Visual Studio中是相同的?

2 个答案:

答案 0 :(得分:0)

你的最后一个问题询问MSVC是否有2个字节用于联合:是的。

您的联盟有一个struct变体嵌套在struct中。怎么可能是1个字节?没有工会,

#pragma pack(push,1) 

typedef struct {
    byte_t enable       :1;
    byte_t rs           :1;
    byte_t              :1;
    byte_t              :1;
    struct 
    {
        byte_t db4          :1;
        byte_t db5          :1;
        byte_t db6          :1;
        byte_t db7          :1; 
    }msnibble;
} thatstruct;

#pragma pack(pop)

的大小为2.在哪里可以说嵌套结构可以打包成1个字节?

答案 1 :(得分:-1)

  

如果结构在联盟内部可以占用不到1个字节吗?

不。嵌套的struct占用一个完整的字节,外部的struct最多占两个字节。