【发布时间】:2021-12-28 01:45:57
【问题描述】:
背景:我对内存位置知之甚少,既不知道零大小对象如何工作,也不知道如何操作它们。
由于没有非静态数据成员的标准布局类类型的基类子对象的大小为零(source 1 ),我希望在以下代码中struct B 的基类子对象大小为零
struct A{};
struct B:A{};
int main(){A a; B b;}
a 和 bobjects 的大小都是 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。你说的对。通过这个问题,我想到了“学习这个”。我没有找到正确深入了解此内容的好方法
-
你试过打印你的两个对象的地址吗?我不确定您是否问
a和b是否共享相同的地址。 -
两个不同的对象不能有相同的地址。空基优化意味着,在您的情况下,
B的A-part 不消耗内存 - 并且副作用可能是(但不保证是)A-part 的地址可以与整个对象的地址相同。在您的代码中,a和b是不同的对象(a不是b的一部分),因此它们不能具有相同的地址。此外,该标准要求sizeof为所有对象和可实例化类型提供非零结果。a的大小不会为零,即使空基优化应用于B的A部分。