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

Posted

技术标签:

【中文标题】std::array 中的内存是不是连续?【英文标题】:Is the memory in std::array contiguous?std::array 中的内存是否连续? 【发布时间】:2011-10-01 18:04:34 【问题描述】:

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

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

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

【问题讨论】:

是的,我做到了。感谢您找到它。 【参考方案1】:

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

您可以安全地将&amp;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

标题&lt;array&gt; 定义了一个类模板,用于存储固定大小的对象序列。数组支持随机访问迭代器。 array&lt;T, N&gt; 的实例存储 N 类型为 T 的元素,因此 size() == N 是一个不变量。 array 的元素是连续存储的,这意味着如果aarray&lt;T, N&gt;,那么它对所有0 &lt;= n &lt; N 都服从&amp;a[n] == &amp;a[0] + n 的标识。

还有§23.3.2.1 [array.overview] p2:

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

array&lt;T, N&gt; a = 初始化列表 ;

另外,在p3 中,列出std::array 的成员:

T elems[N]; // exposition only [ 注意: 成员变量elems 仅用于说明,以强调array 是一个类聚合。 elems 这个名字不是array 界面的一部分。 ——尾注 ]

【讨论】:

标准明确规定std::vector 应具有连续的内存分配,与std::array 的情况类似? @Als:首先,无论如何我都会收到 cmets 的通知,第二,是的。 :) 只是出于好奇,标准中的引用是否明确要求 std::array&lt;_T, _N&gt; 在底层实现为 _T arr[_N]??并不是说这是个好主意,但有什么能阻止我拥有一个 std::array 类,它在幕后分配正确大小的 std::vector 并阻止任何调整大小?正如我所说,我并不是说这是个好主意。 @Darren std::array 是一个聚合的要求。 @Xeo,Luc:很好,看起来他们已经覆盖了所有的基础...... :)【参考方案2】:

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

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

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

【讨论】:

这只是std::array 的一种实现。你的答案是正确的,但你的理由是无效的。其他实现可以以不同的方式编写类。他们不能这样做的原因是因为它会违反规范。你忘了提。 可能,购买 GNU 实现使用相同的方法:gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.3/…

以上是关于std::array 中的内存是不是连续?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCL 中的全局内存是不是连续

数组向量的内存布局是啥?

std::array 初始化中的大括号省略

std::array 中使用的 C++ 11 中的全局常量

Leetcode刷题笔记-数组

模板中的错误 std::bad_array_new_length