C++ 如果一个POD被包装在一个类中,它会产生同样的效果吗?

C++ 如果一个POD被包装在一个类中,它会产生同样的效果吗?,c++,class,wrapper,C++,Class,Wrapper,以下是两种不同的解释: char c; // 1 struct MyChar { char c; }; // 2 如果我做了newmychar[100],它会在所有平台上分配100字节吗?添加非virtualconstructor/destructor和/或operators将对MyChar的大小产生任何影响?MyChar可能在c之后有未命名的填充字节,因此不保证sizeof(MyChar)在MSVC上是1,您可以使用: #pragma pack(1) struct MyChar {

以下是两种不同的解释:

char c;  // 1
struct MyChar { char c; };  // 2

如果我做了
newmychar[100]
,它会在所有平台上分配100字节吗?添加非
virtual
constructor/destructor和/或
operator
s将对
MyChar
的大小产生任何影响?

MyChar
可能在
c
之后有未命名的填充字节,因此不保证
sizeof(MyChar)
在MSVC上是
1
,您可以使用:

#pragma pack(1)
struct MyChar 
{ 
    char c; 
}; 

// Restore
#pragma pack()

是否有任何标准语言支持来避免这种填充;您唯一的选择是真正使用编译器特定的结构打包pragma/attributes。许多常见编译器使用
#pragma pack(1)
。。。GCC,IBM,MS。。。不过,如何最好地在以后恢复默认打包可能会有一点变数,我不记得:-)。您确定吗?我几乎可以肯定,您需要使用
#pragma pack(push)/#pragma pack(1)
,然后使用
#pragma pack(pop)
。我的理解是,
#pragma pack()
将pack值设置回其默认值,不管是什么,在使用
#pragma pack(1)
推送
弹出
来堆叠pragma包之前,该值可能不是打包的值。它们不是必需的。例如,您的包装可能是2,然后是4,然后是1,在那里您可以使用
push/pop
。我使用了
pack(1)
,然后使用
pack()
还原,并根据需要工作。