用户代码可以安全地使用struct padding吗?

时间:2010-01-06 13:44:27

标签: c++ c struct alignment padding

假设我有如下结构:

struct Struct {
    char Char;
    int Int;
};

sizeof( int )大于1且编译器为Char成员变量添加填充 - 是否允许编译器生成的代码更改填充字节的值?

我的意思是,如果我使用指针算法并将一些数据写入Char成员变量周围的填充字节,稍后进行variable.Char =赋值,编译器生成的代码也可能会覆盖某些填充字节?

4 个答案:

答案 0 :(得分:13)

如果编译器足够聪明,可以使用单词write来保存char,该怎么办?您精心保存的数据将丢失。 ; - )

答案 1 :(得分:10)

以下句子错误:不,它不会覆盖填充字节。但使用它可能不是一个好习惯。如果需要,可在那里添加成员变量。

我根据评论表明(正确)我是愚蠢的:

C标准有一个“附件J”,其中 J.1未指明行为。它说,“在结构或联合中存储值时填充字节的值”。这意味着编译器可以生成它想要将数据写入结构的任何指令,这可能允许它在成员之后覆盖填充。

答案 2 :(得分:4)

你确定可以在那里写一些东西,而memset - 这种结构的实例就是这样做的。但是,不安全,从来不是一个好主意。有一天,另一个开发人员将某个#pragma放在某处或者将一个成员添加到struct声明中,你的代码会以许多奇怪和奇特的方式爆炸,这可能需要很长时间才能进行调试。

答案 3 :(得分:1)

这样做的唯一原因就是插件可以欺骗主机应用程序存储额外的数据。

不要这样做,因为在未来的某个时刻它破裂,对所有相关人员来说都是一个严重的问题。