"没有满足这些约束的较小数组对象"是什么意思?

What does "there is no smaller array object that satisfies these constraints" mean?

本文关键字:数组 小数 对象 是什么 意思 满足 约束      更新时间:2023-10-16

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

3 如果在与另一个对象 e 相关联的存储中创建完整对象 (8.3.4(,类型为 "N 的数组" 无符号字符"或类型为"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在 16 字节数组中仅使用 4 个字节(假设sizeof(int)为 4(。那么,3.3的含义是什么?

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

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


关于使用 4 个字节的*p。请务必注意,区域[b->b + 4, b->b +8)虽然是*p所在的存储,但不是提供存储的数组对象(该区域根本不是数组对象(。最小的数组对象将是 b->b .