【问题标题】:How to deal when two objects share the same address?当两个对象共享同一个地址时如何处理?
【发布时间】:2021-12-28 01:45:57
【问题描述】:

背景:我对内存位置知之甚少,既不知道零大小对象如何工作,也不知道如何操作它们。

由于没有非静态数据成员的标准布局类类型的基类子对象的大小为零(source 1 ),我希望在以下代码中struct B 的基类子对象大小为零

struct A{};
struct B:A{};
int main(){A a; B b;}

abobjects 的大小都是 1 字节,但在草案中它说 (source_2):

大小为零的非位域子对象的地址是地址 的完整对象占用的未指定字节的存储空间 那个子对象。

所以基类子对象的地址是b占用的一个未指定字节的地址,但它只有1个字节,所以b和它的基类子对象共享同一个地址?如果我没有遗漏任何内容并且结论是正确的,那么当“指针”指向时如何处理零大小的子对象?

【问题讨论】:

  • how zero size subobjects are handled when "pointered" to? 这不正是您引用的内容吗? The address of a non-bit-field subobject of zero size is the address of an unspecified byte of storage occupied by the complete object of that subobject..
  • 我对内存位置知之甚少,既不知道零大小对象是如何工作的,也不知道如何操作它们 -- 你有没有考虑过先学习这个?如果您对布局没有太多了解,那么答案可能不太清楚。在实践中,地址的唯一性通常不重要也不应该重要。引用只是讨论了内存中对象的有效布局。如果它为零,则取消引用时没有偏移。如果它不为零,那么就有一个非零偏移量。
  • @Human-Compiler。你说的对。通过这个问题,我想到了“学习这个”。我没有找到正确深入了解此内容的好方法
  • 你试过打印你的两个对象的地址吗?我不确定您是否问ab 是否共享相同的地址。
  • 两个不同的对象不能有相同的地址。空基优化意味着,在您的情况下,BA-part 不消耗内存 - 并且副作用可能是(但不保证是)A-part 的地址可以与整个对象的地址相同。在您的代码中,ab 是不同的对象(a 不是 b 的一部分),因此它们不能具有相同的地址。此外,该标准要求sizeof 为所有对象和可实例化类型提供非零结果。 a 的大小不会为零,即使空基优化应用于 BA 部分。

标签: c++ object pointers


【解决方案1】:

所以基类子对象的地址是b占用的一个未指定字节的地址,但它只有1个字节,所以b和它的基类子对象共享同一个地址?

是的。

如果我没有遗漏任何内容并且结论是正确的,那么当“指针”指向时如何处理零大小的子对象?

指针的值是(子)对象的地址。与非零大小的(子)对象相同。

【讨论】:

  • 也许我的以下问题揭示了我对对象模型的理解不成熟。但它指向零大小?我的意思是,它指向不存在的东西?完整的对象具有字节存储,即使那里没有任何有用的东西,但是指向零大小子对象的指针?我想不通
  • 这只是语言律师避免说它指向任何特定的东西——只是两个东西的地址是相同的。
  • @Roman 根据规则,指向子对象的指针指向“完整对象占用的未指定存储字节”。不多也不少。事实上,不使用存储的对象在其存储中不会有任何有用的东西。
  • @eerorika。对于零大小的子对象,为什么还要有这样的地址?
  • @Roman 通过能够指向/引用具有某些东西的对象获得类似的东西。可以调用成员函数,可以比较对象是否与其他对象相同等。
猜你喜欢
  • 1970-01-01
  • 2021-08-19
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
相关资源
最近更新 更多