我正在模拟一个LCD并行端口连接(对于那些对HD44780感兴趣的人,在4位模式下)。
即使对齐设置为1,此并集仍然占用2个字节。如果我去掉了msnibble结构(直接在联合的结构中把db4放到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);
}我正在用ubuntu中的netbeans和gcc一起编译。由于杂注是一个编译器指令,我想知道它在Microsoft Visual Studio中是否相同?
发布于 2016-05-26 01:27:03
最后一个问题是问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个字节?
发布于 2016-05-26 02:13:54
如果结构在一个联合中,那么
可以占用少于1个字节的空间吗?
不是的。嵌套的struct接受一个完整的字节,而外部的struct向上舍入为两个字节。
https://stackoverflow.com/questions/37443477
复制相似问题