Для некоторых графических работ мне нужно как можно быстрее прочитать в большом количестве данных и в идеале хотелось бы прямо читать и записывать структуры данных на диск. В основном у меня есть загрузка 3d-моделей в различных форматах файлов, которые слишком долго загружаются, поэтому я хочу записать их в своем "подготовленном" формате в виде кеша, который будет загружаться намного быстрее при последующих запусках программы.
Безопасно ли это сделать так? Мои заботы вокруг прямого чтения в данные вектора? Я удалил проверку ошибок, жестко закодировал 4 как размер int и т.д., Чтобы я мог дать короткий рабочий пример, я знаю, что это плохой код, мой вопрос в том, действительно ли в С++ читать целый массив структур непосредственно в такой вектор? Я считаю, что это так, но С++ имеет так много ловушек и undefined behavour, когда вы начинаете идти на низкий уровень и напрямую работаете с необработанной памятью.
Я понимаю, что числовые форматы и размеры могут меняться на разных платформах и компиляторах, но это будет даже прочитано и записано одной и той же программой компилятора для кэширования данных, которые могут понадобиться при более позднем запуске одной и той же программы.
#include <fstream>
#include <vector>
using namespace std;
struct Vertex
{
float x, y, z;
};
typedef vector<Vertex> VertexList;
int main()
{
// Create a list for testing
VertexList list;
Vertex v1 = {1.0f, 2.0f, 3.0f}; list.push_back(v1);
Vertex v2 = {2.0f, 100.0f, 3.0f}; list.push_back(v2);
Vertex v3 = {3.0f, 200.0f, 3.0f}; list.push_back(v3);
Vertex v4 = {4.0f, 300.0f, 3.0f}; list.push_back(v4);
// Write out a list to a disk file
ofstream os ("data.dat", ios::binary);
int size1 = list.size();
os.write((const char*)&size1, 4);
os.write((const char*)&list[0], size1 * sizeof(Vertex));
os.close();
// Read it back in
VertexList list2;
ifstream is("data.dat", ios::binary);
int size2;
is.read((char*)&size2, 4);
list2.resize(size2);
// Is it safe to read a whole array of structures directly into the vector?
is.read((char*)&list2[0], size2 * sizeof(Vertex));
}