两个结构对象保证相同的填充?

时间:2017-11-23 10:51:08

标签: c struct

我最近发现C中的结构赋值就像a = b一样简单(我使用memcpy / memmove / custom函数这么久)。 我的问题是: 两个具有相同结构的对象是否始终保证具有相同的填充以使a = b盲目地工作?

2 个答案:

答案 0 :(得分:1)

在6.2.6节中,C标准(草案N1570)讨论了如何表示类型。第6.2.6.1条第4款规定:“存储在任何其他对象类型的非位字段对象中的值由 n × CHAR_BIT 位组成,其中 n 是该类型对象的大小,以字节为单位。“

这里明确的含义是,对于任何一种类型,都有一个 n ,它是用于表示该类型对象的字节数。因此,相同类型的两个不同结构将具有相同的字节数。

它解决了总字节数。我们也可以考虑两个结构是否可能有一些不同的填充字节内部排列。

6.25 20说:“结构类型描述了一组顺序分配的非空成员对象(在某些情况下,还有一个不完整的数组),每个成员都有一个可选的指定名称和可能不同的类型。”所以我们看到了结构旨在由单独的对象组成。在7.19 3中,标准定义了一个offsetof maxro,它接受类型和成员的名称,并计算类型中成员的偏移量。由于这使用的是类型,而不是该类型的特定对象,因此对于该类型的所有对象,偏移量必须相同。因此,结构的所有成员在结构的所有对象实例中都具有相同的位置。

答案 1 :(得分:0)

C标准在赋值运算符上放置了一些条件,其中一个必须保持。这是条件之一

  

左操作数具有与右侧类型兼容的结构或联合类型的原子,限定或非限定版本

任何类型都与自身兼容。

标准进一步说

  

将右操作数的值转换为赋值表达式的类型,并替换存储在左操作数指定的对象中的值。

从任何类型到自身的转换都是无操作。

因此,您的任务可以保证工作并产生明显的效果。一个不必吸引尺寸,对齐或填充。