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

时间:2017-09-27 13:04:31

标签: c++ sizeof stdarray

这是获取std::array::data()返回内容的最简单/最短的方法吗?

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

编辑:我的问题不准确。 “内存大小”是指数组中包含的所有元素(自身)的大小,如果是它们是指向结构的指针,我只想要指针的大小,而不是指向的结构。我也不想包含std::arr实现的任何可能开销的大小。只是数组元素。

有人建议sizeof(arr)。这:What is the sizeof std::array<char, N>?不同意。虽然它似乎在我的机器上工作但我想知道标准保证什么。

6 个答案:

答案 0 :(得分:5)

您可以直接在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);
}

live example on wandbox

来自cppreference

  

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

     

此容器是聚合类型,其语义与struct相同,其中包含C样式数组T[N]作为其唯一的非静态数据成员。

答案 1 :(得分:2)

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

保证遵循以下事实:包装的T[N]数组必须是std::array<T,N>的第一个成员,但未指定其他成员。

答案 2 :(得分:0)

阅读documentation of std::array。所以是的,它可能是。或者尝试

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

但我会使用sizeof(arr)

顺便说一下,我不确定你对此有任何正式的保证。我想该标准理论上允许std::arraystd::vector相同,除了resize()和其他一些方法将被隐藏。但是没有理智的实现会这样做(因为发明std::array是为了将普通数组打包在类似于向量的容器中)。

也许只允许std::array - s最多两个元素的实现(否则抛出一些异常)可能符合标准的字母。

答案 3 :(得分:0)

我理解你在问:array<value_type,N> arr元素集合占用的内存大小是多少,arr.begin()arr.end()之间是什么?

答案是sizeof(value_type)*N,这在标准中有说明,但需要一些处理才能得出这个结论。

在C ++标准[dcl.array]中(这是关于(c-)数组而不是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。

答案 4 :(得分:0)

由于没有人发布任何比我的第一个猜测更好的内容,sizeof(arr)很可能不保证不包含任何可能的其他std::array's字段的大小我& #39;我选择这个作为接受的答案。

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

如果有人想出更好的东西我会乐意接受他们的答案。

答案 5 :(得分: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;
}