【问题标题】:C++ valarray vs array size allocationC++ valarray 与数组大小分配
【发布时间】:2021-03-09 08:30:27
【问题描述】:

我正在分配一个大小为 2000x2000 的多维 valarray,它工作顺利。

valarray<valarray<int>> D(valarray<int>(-2,2000), 2000);
D[1999][1999] = 2000;

但是,如果我尝试分配一个普通数组并访问一个元素,则会出现分段错误。

int A[2000][2000];
A[1999][1999] = 2000;

两者都在堆栈上,为什么会有这种差异?

【问题讨论】:

  • 堆栈对象有一个最大尺寸。 2000*2000*sizeof(int) 必须大于该大小

标签: c++ multidimensional-array segmentation-fault valarray


【解决方案1】:

std::vector一样,std::valarray的底层存储是动态的,管理这个存储的对象的大小不依赖于元素的数量。

这个程序:

#include <iostream>
#include<valarray>

int main() {
    std::cout << "sizeof(std::valarray<std::valarray<int>>): " 
              << sizeof(std::valarray<std::valarray<int>>) << std::endl;
    std::cout << "sizeof(int[2000][2000]): " << sizeof(int[2000][2000]) << std::endl;
}

为我产生这个输出:

sizeof(std::valarray<std::valarray<int>>): 16
sizeof(int[2000][2000]): 16000000

如果你改用std::array,你会遇到问题。

【讨论】:

  • 所以,我的堆栈上没有 400 万个 -2。我所拥有的是一个指向包含 400 万个 -2 的内存的指针?
  • @AdityaSinghRathore 你拥有的是一个valarray 实例,它(可能)包含与四百万个ints 相关的两个指针。确切的细节取决于实施。
【解决方案2】:

两者都在堆栈上,为什么会有这种差异?

因为std::valarray 是非常非常小的对象。它的大小完全由实现定义,但在我查看的特定标准库实现中,它是两个指针的大小。

相比之下,二维数组 A 的大小超过 15 兆字节,假设为 4 字节 int。可用于自动对象(在所有对象之间共享)的可用空间通常远小于典型语言实现中的空间。

【讨论】:

    【解决方案3】:

    动态内存分配隐藏在valarray类的构造函数内部,最终还是使用new或者malloc。

    实际上 valarray 不在堆栈上。这就是为什么构造数组溢出而 valarray 没有。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-26
      • 2013-07-21
      • 1970-01-01
      • 2013-10-28
      • 1970-01-01
      • 2015-10-30
      • 2019-07-24
      • 2011-01-03
      相关资源
      最近更新 更多