【发布时间】:2017-02-09 13:19:52
【问题描述】:
在回答this question 时,我被要求提供标准报价。在 C++14 草案中我震惊地发现:
§ 3.9 类型 [basic.types]
- T 类型对象的对象表示是 T 类型对象占用的 N 个 unsigned char 对象的序列,其中 N 等于 sizeof(T)
嗯.. 它并没有说“无符号字符对象”在内存中必须是连续的。也许它是由“序列”暗示的。然后我发现了“连续存储字节”的具体提及,但是......
§ 1.8 C++ 对象模型 [intro.object]
- [...] 普通可复制或标准布局类型 (3.9) 的对象应占用连续的存储字节。
什么?只需要普通可复制和标准布局类型来占用连续字节的存储空间吗?其余类型在它们占用的存储空间中可以有“洞”吗?我搜索了标准的其余部分,但找不到与“连续存储”的任何其他相关性。当然,我对标准不是很熟悉。
如果这是真的(对我来说,这将是对标准最大的震惊)sizeof 和指针算术如何实现? (曾经)真的有任何架构/编译器使用(使用的)非连续字节存储类型吗?
我真的希望我误解和/或遗漏了什么。
edit:我认为这可能与填充有关,但这种解释只有在普通可复制或标准布局类型不能有填充时才有意义。然后你说这些类型占用了连续的字节存储空间,而对于其他可以填充的类型,你不会这么说。但显然情况并非如此,因为任何结构类型都可以有填充。
【问题讨论】:
-
@JoachimPileborg 这也是我所知道的。但是普通可复制和标准布局类型都有填充。那么为什么说只有那些类型才需要“连续存储”呢?
-
对象中的孔可能是对齐要求的产物,例如当您有
struct { char a; int b;}时,布局可能是 char(1 字节)、hole(3 字节)、int(4 字节)。 -
@OlafDietsche,是的,但这适用于标准布局和可简单复制的其他结构类型。那么,为什么它将标准布局和可简单复制的布局单独列为需要连续内存的布局呢?
标签: c++ layout language-lawyer