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

时间:2011-07-09 05:17:32

标签: c++ arrays pointers c++11 contiguous

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

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

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

2 个答案:

答案 0 :(得分:29)

是的,它是连续的,因为它基本上(实际上)是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> NT类型size() == N元素的实例,以便array是一个不变量。 a的元素是连续存储的,这意味着如果array<T, N>&a[n] == &a[0] + n,则它会服从所有{{1}的身份0 <= n < N }}

§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 ]

答案 1 :(得分:0)

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

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

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