在std::array中的内存是否连续
Is the memory in std::array contiguous?
std::array
的内存是连续的吗?以下是有效的/好的做法吗?
std::array<type1,Num> arr = //initialize value
type1 * ptr = &arr[0];
我可以把ptr
传递给期望c风格数组的函数吗?
是的,它是连续的,因为它基本上(实际上)是一个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>
的实例存储T
类型的N
元素,因此size() == N
是一个不变量。array
的元素连续存储,这意味着如果a
是array<T, N>
,那么所有0 <= n < N
都遵循&a[n] == &a[0] + n
的身份。
And §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]
是std::array
的内存是连续的。在VC10上,它被声明为:
template<class _Ty,
size_t _Size>
class array
{ // fixed size array of values
...
_Ty _Elems[_Size == 0 ? 1 : _Size];
};
其中_Elemes
只是一个给定类型的简单数组
相关文章:
- 我在 IDA 或 dbg 或 olly 上看到的内存是否与我在 RAM 上实时加载的内存相同?
- 访问"std::vector"的保留但未调整大小的内存作为原始内存是否安全?
- 本地分配的内存是否可以用于将来使用?
- 多次分配内存是否一次性需要更多时间?
- 删除矢量的尾部(通过擦除)内存是否有效
- 如何找出内存是否属于堆或堆栈
- C++:提升:托管共享内存是否需要信号量锁
- 在 C/C++ 中在特定地址边界上对齐内存是否仍能提高 x86 性能?
- 检查内存是否在堆上
- C++内存 - 是否需要删除使用 'new' 创建的基元类型变量?
- 如果通过委托给“malloc”的重载“new[]”分配,“释放”内存是否安全
- 分配给 cpp 中定义的全局静态变量的内存是否在 C++ 中删除其类的实例后释放
- 我的 265GB RAM 笔记本电脑上的内存是否超过 8GB
- 在动态内存分配中,在程序终止并且忘记释放内存后,该内存是否保持分配状态
- 这些二维数组(C++)的内存是否不足
- 如果我在 for 中声明一个对象,它的内存是否会在那之后被释放?
- 二进制搜索树(如何在插入时检查内存是否不足)
- 用new重新分配内存是否安全
- 在构造函数初始化列表中分配内存是否存在任何问题
- 内存映射内存是否可能