【发布时间】:2011-01-02 01:37:23
【问题描述】:
假设我有如下结构:
struct Struct {
char Char;
int Int;
};
并且sizeof( int ) 大于一并且编译器为Char 成员变量添加填充 - 编译器生成的代码是否允许更改填充字节的值?
我的意思是,如果我使用指针算法并将一些数据写入 Char 成员变量周围的填充字节,然后再进行 variable.Char = 赋值,编译器生成的代码可能还会覆盖一些填充字节?
【问题讨论】:
-
@nobugz,我认为这是一个有效的问题。在设置值之前您已将结构设置为 0 的图像,然后您可以稍后使用 memcmp 比较两个结构,但前提是编译器不接触填充字节。
-
不要乱用填充,
memset或memcpy使用类和结构。 更安全和更健壮的方法是实现读取和写入打包缓冲区的方法(例如unsigned char[])。保险值得额外的可执行空间和时间。 -
@Thomas Matthews,我想你误解了我的意思。我在谈论比较两个结构,请参阅stackoverflow.com/questions/141720/…
-
如果您关心字节对齐,大多数编译器允许您显式声明它。例如,在 VS 中,您可以使用 #pragma pack(1) 告诉编译器完全按照声明的方式打包您的结构,而无需额外填充。在这种情况下,sizeof(Struct) 将恰好是 sizeof(char)+sizeof(int),仅此而已。我见过使用这种机制的唯一有效用途是套接字编程,但我确信还有其他原因。
标签: c++ c struct alignment padding