c - 为什么这个 Union 占用 2 个字节,即使我对齐到 1 个字节

标签 c

我正在对 LCD 日立显示器并行端口连接进行建模(对于那些感兴趣的 HD44780,采用 4 位模式)。

即使对齐设置为1,这个 union 仍然占用2个字节。如果我去掉 msnibble 结构(直接将 db4 到 db7 放在 union 结构中),它会占用 1 个字节。如果结构位于 union 内,它们可以占用少于 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);
}

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

最佳答案

您的最后一个问题询问 MSVC 是否有 2 个字节用于 union :是的。

您的 union 有一个变体,即嵌套在 struct 中的 struct。怎么可能是1个字节呢?没有 union ,

#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 个字节?

关于c - 为什么这个 Union 占用 2 个字节,即使我对齐到 1 个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37443477/

相关文章:

c - 关于g_signal_connect、g_cclosure_new、gpointer的问题

C-创建一个文件

android - Android/Linux 上 libc C 函数调用的堆栈跟踪

c - 为什么三元没有编译成同一个程序集?

我们可以在函数内部声明函数吗?

c - 用指针编译C程序时出错

C 对如何初始化和实现 pthread 互斥体和条件变量感到困惑

c - mmap MAP_SHARED 不工作

c - 斐波那契数列出了问题?

c++ - 一次打印从套接字接收到的一个字符