gpt4 book ai didi

c++ - 关于 C++ 中数组输出到文件的限制

转载 作者:行者123 更新时间:2023-11-28 03:11:37 24 4
gpt4 key购买 nike

我用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,所以输出那个大小的数组应该没问题。

最佳答案

您的数组太大而无法放入堆栈,无论您有多少 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 那么您的操作系统没有足够的内存来提供。

关于c++ - 关于 C++ 中数组输出到文件的限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18305800/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com