内存是std::array连续的吗?以下是有效/良好的做法吗?
std::array<type1,Num> arr = //initialize value
type1 * ptr = &arr[0];
然后我可以传递ptr给期望 c 样式数组的函数吗?
内存是std::array连续的吗?以下是有效/良好的做法吗?
std::array<type1,Num> arr = //initialize value
type1 * ptr = &arr[0];
然后我可以传递ptr给期望 c 样式数组的函数吗?
是的,它是连续的,因为它基本上(实际上)是 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的接口的一部分。——尾注]
是的,内存std::array是连续的。在 VC10 上,它被声明为:
template<class _Ty,
size_t _Size>
class array
{ // fixed size array of values
...
_Ty _Elems[_Size == 0 ? 1 : _Size];
};
Where_Elemes只不过是一个给定类型的简单数组。