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

关于在c++; 我在C++中编写了一段代码,测试64位(ReHAT Linux)系统中文件输出的限制。硬盘和内存相当大(1TB和64Gb)。由于64位地址,我认为输出文件的最大大小为2^63字节。我用sieof来验证C++(g++编译器)中的以下数据类型,c++,file-io,C++,File Io,下面的代码运行良好 #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)

下面的代码运行良好

#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;
}
#包括
#包括
使用名称空间std;
int main(int argc,char*argv[])
{
字符数据[200000][10000];
fstream输出文件(“output.dat”,ios::out | ios::binary);
输出文件写入(&D数据[0][0],200000*10000);
outfile.close();
返回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;
}
#包括
#包括
使用名称空间std;
int main(int argc,char*argv[])
{
双数据[200000][10000];
fstream输出文件(“output.dat”,ios::out | ios::binary);
输出文件写入((字符*)和数据[0][0],大小为(双)*200000*10000);
outfile.close();
返回0;
}

观察到“分段故障(堆芯倾倒)”。但我不明白为什么因为sizeof(double)*200000*10000<2^63,所以输出该大小的数组应该是可以的。

您的数组太大,无法容纳堆栈,无论有多少RAM,堆栈的大小都是有限的。一个快速解决方法是使它们静止。更好的解决方案是使用new或vector动态分配它们。由于数组是二维的,因此传递指向该文件的指针有点棘手。你能做到吗

vector<double> data(2000000000);
fstream outfile("output.dat", ios::out | ios::binary);
outfile.write((char*)&data[0], data.size() * sizeof (double));
矢量数据(2000000000);
fstream输出文件(“output.dat”,ios::out | ios::binary);
outfile.write((char*)和data[0],data.size()*sizeof(double));

如果抛出
std::bad_alloc
,则您的操作系统没有足够的内存提供。

您在堆栈上声明的数据结构对于堆栈来说太大。您的意思是数组太大吗。我很困惑的是,如果64位系统的数组大小小于2^63(如果内存足够),那么数组的大小应该可以吗?我不知道堆栈是做什么的,但是如果要输出那个大数组呢?谢谢。堆栈通常限制在几兆字节左右。即使将其设为全局,2^63字节也需要(显然足够)2^63字节的备份存储。这需要2097152个驱动器(每个驱动器4 TB)作为虚拟内存。我认为可以公平地猜测,您的计算机没有连接200万+4 TB的驱动器。谢谢您的评论。所以,输出如此大的数组的唯一方法就是将其拆分,对吗?我很惊讶
char
示例能够工作。该数组大约为2GB,在堆栈上声明。我想它不会起作用,但你的行为还不明确。在任何情况下,请在堆上分配大量数据(使用
new
)。你可以在一个连续的块中请求它,如果你幸运的话,你会得到它。在一个64GB的系统上,你可能不会做太多其他事情。我认为你是对的。我尝试了您的示例,它似乎是有效的(将数组写入文件需要相当长的时间,但到目前为止还没有返回错误)。但我还是不明白是不是因为2D?如果我使用2000000000的1D数组而不是std::vector,是否可行?@user1285419 vector仅为1D。如果您想要2d,那么要么制作一个大向量并进行索引计算[x+y*xsize](您可以将其封装在一个类中),要么制作
vector v(ysize,vector(xsize)
v[y][x]的形式访问
但是整个数组在内存中不是连续的,因此您不能在单个文件操作中获取指向开头和输出的指针。@user1285419可能我不理解您所说的。问题的原因不是1d/2d。堆栈上的1d数组也会出现同样的问题。
双数据[20000000000]
也不起作用。哦,我明白了,我不知道为vector分配的内存是不连续的。谢谢你指出这一点,它与vector一起工作。@user1285419在一个vector中,内存是连续的。但是如果你使用vector的vector创建一个2d数组,整个内存是不连续的。这是因为每个vector都有自己的alloc反倾销。
vector<double> data(2000000000);
fstream outfile("output.dat", ios::out | ios::binary);
outfile.write((char*)&data[0], data.size() * sizeof (double));