c++ - 技术上对象可以占用不连续的存储字节吗?

标签 c++ layout language-lawyer

在回答 this question 时我被要求提供标准报价。我在 C++14 草案中震惊地发现:

§ 3.9 Types [basic.types]

  1. The object representation of an object of type T is the sequence of N unsigned char objects taken up by the object of type T, where N equals sizeof(T)

嗯..它并没有说“无符号字符对象”在内存中必须是连续的。也许它是由“顺序”暗示的。然后我发现了一个特别提到的“存储的连续字节”,但是......

§ 1.8 The C++ object model [intro.object]

  1. [...] An object of trivially copyable or standard-layout type (3.9) shall occupy contiguous bytes of storage.

什么?只需要普通可复制和标准布局类型来占用连续的存储字节?其余类型在它们占用的存储空间中可以有“漏洞”吗?我搜索了标准的其余部分,但找不到与“连续存储”相关的任何其他内容。当然,我不太熟悉该标准。

如果这是真的(对我来说,这将是对标准的最大震惊) sizeof 和指针算法如何处理?是否真的有任何架构/编译器使用(使用)类型的非连续字节存储?

我真的希望我误解和/或遗漏了什么。


编辑:我认为这可能与填充有关,但只有在平凡可复制或标准布局类型不能有填充的情况下,这种解释才有意义。然后你说这些类型占用连续的字节存储,而对于其他可以填充的类型,你不会这么说。但这显然不是这种情况,因为任何结构类型都可以有填充。

最佳答案

具有虚拟基类的类可能不在连续的内存字节中(因为虚拟基类和类的其余部分之间的一些字节可能被另一个也从虚拟基类派生的类占用。

class A {
    int a;
};

class B: virtual A {
    int b;
};

class C: virtual A {
    int c;
};

class D: public B, C {
    int D;
}

D 类对象的内存可以这样组织:

-------
|  a  |
-------
|  b  |
-------
|  c  |
-------
|  d  |
-------

按递增的内存顺序。由整数“a”和“c”组成的对象“C”不占用连续的内存位置。

关于c++ - 技术上对象可以占用不连续的存储字节吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39800389/

相关文章:

html - 使用 float 项的 CSS 网格

css - 是否可以使 JavaFX TableColumn 的标题文本溢出到另一列?

c++ - 转换常量表达式定义的澄清

c++ - std::make_array<size_t> 来自 signed int

C++ - 如何编写函数指针指向的类型

c++ - 内存池和缓冲区 C++

c++ - 将自定义作者类别添加到 Gtk::AboutDialog 类

c++ - 有没有办法让 QXmlStreamReader 处理格式错误的 XML?

安卓 : is a width of 160dp equals to 100% of the screen width?

c++ - 引用类型和 odr-used 的模板非类型参数