std::array实例地址与.data()返回值是否始终相等?
关于
std::array的&arr == arr.data()是否始终成立的问题 声明:本文仅关注std::array,std::vector显然与之不同。
直接给出结论:在标准C++中,&arr == arr.data()这个等式是始终成立的。
原因解析
根据C++标准对std::array的定义:
std::array属于聚合类型,内部仅包含一个用于存储元素的原生数组作为唯一成员,且该成员是结构体的第一个(也是唯一一个)成员。std::array::data()的作用就是返回指向这个内部原生数组首元素的指针。
结合C++聚合类型的内存布局规则:结构体实例的地址与其第一个成员的地址完全相同。因此&arr(std::array实例的地址)必然等于其内部原生数组的首地址,也就是arr.data()返回的指针值。
对结构体类比的验证
你提到的std::array<int, 3>等价于如下结构体的说法完全准确:
struct Int3 { int a,b,c; };
对于这个结构体实例int3_obj,&int3_obj同样等于&int3_obj.a,和std::array的逻辑完全一致,这也侧面印证了&arr == arr.data()的正确性。
内容的提问来源于stack exchange,提问作者bremen_matt
相关产品推荐
相关产品推荐

