获取 std::array 底层数组的内存大小的最简单方法?

问题描述 投票:0回答:7

这是获取

std::array::data()
返回内容的内存大小的最简单/最短的方法吗?

arr.size() * sizeof(arr.value_type)

编辑:我的问题不准确。 “内存中的大小”是指数组中包含的所有元素(它们本身)的大小,因此如果例如它们是指向结构的指针,我只想要指针的大小,而不是指向的结构。我也不想包含

std::arr
实现的任何可能开销的大小。只是数组元素。

有人建议

sizeof(arr)
。这: std::array 的大小是多少? 不敢苟同。虽然它似乎可以工作在我的机器上我想知道标准保证了什么。

c++ sizeof stdarray
7个回答
6
投票
您可以直接在

sizeof

 实例上使用 
std::array
 运算符:

sizeof(arr)

示例:

struct foo { int a; char b; }; int main() { std::array<foo, 10> a; static_assert(sizeof(foo) == 8); static_assert(sizeof(a) == 80); }

wandbox 上的实时示例


来自

cppreference

std::array

是一个封装固定大小数组的容器。

此容器是一个

聚合类型,其语义与持有 C 样式数组 struct

 作为其唯一非静态数据成员的 
T[N]
 相同。 


3
投票
不能保证

sizeof(std::array<T,N>) == N*sizeof(T)

,但可以保证
sizeof(std::array<T,N>) >= N*sizeof(T)
。额外的大小可能是命名的(但未指定的)成员和/或未命名的填充。 

保证遵循以下事实:包装的

T[N]

 数组必须是 
std::array<T,N>
 的第一个成员,但未指定其他成员。


2
投票
由于没有人发布任何比我的第一个猜测更好的内容,并且

sizeof(arr)

 最有可能 
不保证不包括任何可能的附加 std::array's
 字段的大小,我选择此作为接受的答案。

arr.size() * sizeof(arr.value_type)

如果有人想出更好的办法,我很乐意接受他们的答案。


0
投票
我明白你在问:位于

array<value_type,N> arr

arr.begin()
 之间的 
arr.end()
 元素的集合占用的内存大小是多少?

答案是

sizeof(value_type)*N

,这是标准中规定的,但需要一些处理才能得出这个结论。

在 C++ 标准 [dcl.array] 中(这是关于 (c-)array 而不是

std::array

):

数组类型的对象包含连续分配的非空集合,由 N 个类型为 T 的子对象组成。

在[expr.add]中(这里术语数组也指(c-)数组):

当具有整型类型的表达式与指针相加或相减时,结果具有以下类型 指针操作数。如果表达式 P 指向具有 n 个元素的数组对象 x 的元素 x[i],则 86 表达式 P + J 和 J + P(其中 J 的值为 j)指向(可能是假设的)元素 x[i + j] 如果 0 ≤ i + j ≤ n;否则,行为是未定义的。同样,表达式 P - J 指向 (可能假设的)元素 x[i − j] 如果 0 ≤ i − j ≤ n;否则,行为是未定义的。

并且在[array.data]中(这里术语数组指的是

std::array

):

constexpr T* data() noexcept; constexpr const T* data() const noexcept;

返回:一个指针,使得 data() == addressof(front()),并且 [data(), data() + size()) 是 有效范围。

因此

data()

 返回 
std::array
 的元素的有效范围,该范围是可使用指向 value_type 的指针进行迭代的,因此它遵循指针算术,该算术遵循 (c-) 数组索引的规则,以及 ( c-) 数组是连续的。 Q.E.D.


0
投票
我认为你必须恢复使用像

这样的辅助函数

template <typename T> auto getSize(T& t) -> size_t { typename T::size_type size = t.size(); size_t value_type_size = sizeof(typename T::value_type); return size * value_type_size; }
    

0
投票
如果

value_type

 变得棘手(因为您需要 
sizeof(decltype(var)::value_type)
 作为成员大小),那么总是有 
data()
 类型。

std::array<int, 12> var; size_var = sizeof(*var.data()) * var.size(); std::cout << size_var << std::endl;
在我的机器上输出“48”。


-1
投票
阅读

std::array

的文档。所以是的,可能是这样。或者尝试一下

(arr.size()-1) * sizeof(arr.value_type) + sizeof(std::array<T,1>)

但我只会使用

sizeof(arr)



顺便说一句,我不确定您对此有任何正式保证。我猜想标准理论上会允许

std::array

std::vector
 相同,只是 
resize()
 和其他一些方法会被隐藏。但没有明智的实现可以做到这一点(因为 
std::array
 已被发明来将普通数组打包在类似于向量的容器中)。

也许只允许

std::array

-s 最多有两个元素(但否则抛出一些异常)的实现可能符合标准的字面意思。

© www.soinside.com 2019 - 2024. All rights reserved.