在std::array中的内存是否连续

Is the memory in std::array contiguous?

本文关键字:内存 是否 连续 std array      更新时间:2023-10-16

std::array的内存是连续的吗?以下是有效的/好的做法吗?

std::array<type1,Num> arr = //initialize value
type1 * ptr = &arr[0];

我可以把ptr传递给期望c风格数组的函数吗?

是的,它是连续的,因为它基本上(实际上)是一个type arr[10];,但具有类似STL的接口。它也不会在最轻微的挑衅下衰减为指针。

您可以安全地将&arr[0]传递给期望使用c风格数组的函数,这是它的设计目标。然而,要与STL算法一起使用它,只需使用beginend函数:

// either members
std::sort(arr.begin(), arr.end());
// or free from <iterator>
std::sort(std::begin(arr), std::end(arr));

语言律师部分,§23.3.2.1 [array.overview] p1:

头文件<array>定义了一个类模板,用于存储固定大小的对象序列。数组支持随机访问迭代器。array<T, N>的实例存储T类型的N元素,因此size() == N是一个不变量。 array的元素连续存储,这意味着如果aarray<T, N>,那么所有0 <= n < N都遵循&a[n] == &a[0] + n的身份。

And §23.3.2.1 [array.overview] p2:

数组是一个聚合(8.5.1),可以用语法

进行初始化
  • array<T, N> a = { initializer-list };

同样,在p3中,列出std::array的成员:

T elems[N]; // exposition only
[注意:显示成员变量elems只是为了说明,强调array是一个类聚合。elems不是array的接口名称。 -end note]

std::array的内存是连续的。在VC10上,它被声明为:

template<class _Ty,
    size_t _Size>
    class array
    { // fixed size array of values
                ... 
         _Ty _Elems[_Size == 0 ? 1 : _Size];
    };

其中_Elemes只是一个给定类型的简单数组