首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个Union占用2个字节,即使我对齐到一个字节

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

Stack Overflow用户
提问于 2016-05-26 01:00:54
回答 2查看 140关注 0票数 0

我正在模拟一个LCD并行端口连接(对于那些对HD44780感兴趣的人,在4位模式下)。

即使对齐设置为1,此并集仍然占用2个字节。如果我去掉了msnibble结构(直接在联合的结构中把db4放到db7中),它就占用了1个字节。如果结构在一个联合中,那么它们占用的空间能少于1个字节吗?2字节是否是msnibble占用1字节加上半字节(使能位、rs位和两个空位)的结果,从而使得大小为2字节?

代码如下:

代码语言:javascript
复制
#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一起编译。由于杂注是一个编译器指令,我想知道它在Microsoft Visual Studio中是否相同?

EN

回答 2

Stack Overflow用户

发布于 2016-05-26 01:27:03

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

您的联盟在struct中嵌套了一个变量struct。那怎么可能是1个字节呢?如果没有工会,

代码语言:javascript
复制
#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个字节?

票数 0
EN

Stack Overflow用户

发布于 2016-05-26 02:13:54

如果结构在一个联合中,那么

可以占用少于1个字节的空间吗?

不是的。嵌套的struct接受一个完整的字节,而外部的struct向上舍入为两个字节。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37443477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档