从技术上讲,对象可以占用不连续的存储字节吗?

2024-01-08

回答的同时这个问题 https://stackoverflow.com/questions/39791806/array-of-non-contiguous-objects我被要求提供标准报价。我震惊地在 C++14 草案中发现:

§ 3.9 类型 [basic.types]

  1. T 类型对象的对象表示是 T 类型对象占用的 N 个 unsigned char 对象的序列,其中 N 等于 sizeof(T)

嗯..它并没有说“unsigned char 对象”在内存中必须是连续的。也许这是“顺序”所暗示的。然后我发现具体提到了“连续字节存储”,但是......

§1.8 C++对象模型[intro.object]

  1. [...] 普通可复制或标准布局类型 (3.9) 的对象应占用连续的存储字节。

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

如果这是真的(对我来说,这将是该标准最大的震惊)那怎么样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  |
-------

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从技术上讲,对象可以占用不连续的存储字节吗? 的相关文章

随机推荐