0

我用c++编写了一段代码来测试64位(redhat linux)系统中文件输出的限制。硬盘和内存相当大(1TB 和 64Gb)。由于 64 位地址,我认为输出文件的最大大小为 2^63 字节。我使用 sizeof 在 c++(g++ 编译器)中验证以下数据类型

sizeof(double) = 8, sizeof(size_t) = 8, sizeof(std::streamsize) = 8

以下代码效果很好

#include <iostream>
#include <fstream>
using namespace std;

int main(int argc, char *argv[])
{
  char data[200000][10000];

  fstream outfile("output.dat", ios::out | ios::binary);
  outfile.write(&data[0][0], 200000*10000);
  outfile.close();

  return 0;
}

但是如果我使用 double 代替

#include <iostream>
#include <fstream>
using namespace std;

int main(int argc, char *argv[])
{
  double data[200000][10000];

  fstream outfile("output.dat", ios::out | ios::binary);
  outfile.write((char*)&data[0][0], sizeof(double)*200000*10000);
  outfile.close();

  return 0;
}

观察到“分段错误(核心转储)”。但我不明白为什么由于 sizeof(double)*200000*10000 < 2^63,所以输出该大小的数组应该没问题。

4

1 回答 1

2

您的数组太大而无法放入堆栈,无论您拥有多少 RAM,堆栈的大小都是有限的。一个快速解决方法是使它们成为静态的。更好的解决方案是使用 new 或 vector 动态分配它们。您的数组是 2d 的事实使得将指针传递给文件有点棘手。你能做这个吗?

vector<double> data(2000000000);
fstream outfile("output.dat", ios::out | ios::binary);
outfile.write((char*)&data[0], data.size() * sizeof (double));

如果这抛出了std::bad_alloc,那么你的操作系统没有足够的内存来提供。

于 2013-08-19T03:17:20.673 回答