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 的界面。它也不会因最轻微的挑衅而衰减为指针。
您可以安全地将&arr[0]
传递给需要C 样式数组的函数,这就是它的设计目标。但是,要将其与 STL 算法一起使用,只需使用 begin
和 end
函数:
// 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
是一个不变量。array
的元素是连续存储的,这意味着如果a
是array<T, N>
,那么它对所有0 <= n < N
都服从&a[n] == &a[0] + 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::vector
应具有连续的内存分配,与std::array 的情况类似?
@Als:首先,无论如何我都会收到 cmets 的通知,第二,是的。 :)
只是出于好奇,标准中的引用是否明确要求 std::array<_T, _N>
在底层实现为 _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 中的内存是不是连续?的主要内容,如果未能解决你的问题,请参考以下文章