问题 “没有更小的数组对象满足这些约束”是什么意思?


用于C ++ 17的n4659草案描述了第4章中语言的一般原理。在第4.5章,C ++对象模型[intro.object]中,我无法理解一个句子的含义(强调我的)

3如果在与“n的数组”类型的另一个对象e相关联的存储中创建完整对象(8.3.4)   unsigned char“或类型为”n std :: byte的数组“(21.2.1),该数组为创建的数据提供存储   对象如果:
  (3.1) - e的生命周期已经开始而未结束,并且
  (3.2) - 新对象的存储完全适合e,和
  (3.3) - 没有更小的数组对象满足这些约束。

虽然示例显示数组可以为比数组短得多的元素提供存储:

struct A { unsigned char a[32]; };
struct B { unsigned char b[16]; };
A a;
B *b = new (a.a + 8) B; // a.a provides storage for *b
int *p = new (b->b + 4) int; // b->b provides storage for *p

这里 *p 仅使用4个字节(假设 sizeof(int) 4)是一个16字节的数组。那么,3.3的含义是什么?


5414
2018-01-03 10:02


起源

我不知情的猜测。您可以将char数组放在较大的char数组中,将另一个对象放在较小的char数组中。然后较小的阵列为另一个对象提供存储。 - n.m.


答案:


3.3的含义是要区分 a[32] 从 b[16]。前者不提供存储空间 *p 因为后者呢。它标识最小的唯一数组对象,该对象提供对象所在的存储区域。

如果没有3.3,定义将是可传递的。 a[32] 会提供存储空间 *p 因为它最终提供存储 b[16]


关于 *p 使用4个字节。重要的是要注意该地区 [b->b + 4, b->b +8),同时是存储在哪里 *p 驻留,不是提供存储的数组对象(该区域根本不是数组对象)。那个最小的数组对象就是 b->b


9
2018-01-03 10:07