std :: array中的内存是连续的吗?

Ril*_*ley 17 c++ arrays pointers contiguous c++11

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

std::array<type1,Num> arr = //initialize value
type1 * ptr = &arr[0];
Run Code Online (Sandbox Code Playgroud)

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

Xeo*_*Xeo 29

是的,它是连续的,因为它基本上(实际上)是a 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));
Run Code Online (Sandbox Code Playgroud)

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

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

而且§23.3.2.1 [array.overview] p2:

数组是可以使用语法初始化的聚合(8.5.1)

  • array<T, N> a = { 初始化列表 };

此外,p3列出以下成员std::array:

T elems[N]; // exposition only
[ 注意:成员变量elems仅用于展示,以强调这array是一个类聚合.该名称elems不是array界面的一部分.- 尾注 ]