从二进制转换为多
我目前使用二进制文件快速访问存储在多维数组中的自定义对象,这些自定义对象被保存为文件作为对象数组。 到目前为止,从文件读取没有太多的问题,因为我已经将数组读入堆栈中的相同对象数组。 它看起来像这样:
Foo foo[5][10];
ifstream infile("foofile.dat",ios::in|ios::binary);
infile.read((char*)&foo, sizeof Foo);
我目前遇到的问题是,我越来越多地存储大量的数据,并且在创建本地对象数组时溢出了我的堆栈。 那么解决方案似乎会在堆上创建本地对象数组,并且我不确定如何格式化它,以便我可以直接从char *中进行转换。 这里是我将如何分配在堆上:
Foo (*foo)[1000] = new Foo [500][1000];
然而,如果我想投射到整个阵列,这似乎不是正确的格式。 例如,如果我尝试执行以下操作,则不起作用:
ifstream infile("foofile.dat",ios::in|ios::binary);
infile.read((char*)(*foo), (sizeof Foo * 500 * 1000)); //or below
infile.read((char*)(&foo), (sizeof Foo * 500 * 1000)); //or below
infile.read((char*)(foo), (sizeof Foo * 500 * 1000)); //or below
本质上,我不知道如何使用我已经分配在堆上的数组来构造这个。 任何人都可以提供任何指针(heh)?
非常感谢,吉姆
在我看来,使用C ++机制来分配/解除分配是没有意义的,因为你完全通过读取来覆盖数据。 所以不要做new
/ delete
东西。 你的cast (char*)
实际上是一个reinterpret_cast< char* >
。 为什么不使用正确大小的malloc
?
typedef Foo largeFoo[500][1000];
largeFoo* data = reinterpret_cast< largeFoo* >(malloc(sizeof largeFoo));
然后做你的阅读(再reinterpret_cast
)。 为了方便起见,您可以将指针别名为参考。
largeFoo& foo = *data;
因此所有剩余的代码可以保持与堆栈版本相同,最后只有一个free
的指针。
我不认为你使用的解决方案在一般情况下会起作用; 现代操作系统利用堆随机化,因此跨程序的多次运行并不总是可以声称相同的虚拟地址空间。
如果任何存储的对象包含指针,则当您加载到不同的虚拟拓扑中时,它们会晃动。
您是否尝试将对象序列化为适当的磁盘格式,而不是只写一个二进制blob?
自从我编写非托管代码已经很长时间了,我现在甚至不记得语法。 有一种方法可以分配连续的内存块并能够投射到多维数组。 如果您一次性分配所有需要的数据,则将每个元素指向该模块中的相关位置。 (道歉破坏语法/代码)。
void* ptr = malloc (void*)(sizeof(Foo) * 500 * 1000);
Foo** foo = (Foo**)ptr;
for (int i=0;i<500;i++) {
foo[i] = (Foo*)(ptr+500*i*sizeof(Foo))
}
链接地址: http://www.djcxy.com/p/79249.html