18

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

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

然后我可以传递ptr给期望 c 样式数组的函数吗?

4

2 回答 2

32

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

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

// 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>存储N类型元素的实例T,因此这size() == N是一个不变量。an 的元素array是连续存储的,这意味着如果a是 anarray<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的接口的一部分。——尾注]

于 2011-07-09T05:21:19.820 回答
-1

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

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

Where_Elemes只不过是一个给定类型的简单数组。

于 2011-07-09T05:36:16.923 回答