Для некоторых графических работ мне нужно как можно быстрее прочитать большое количество данных, и в идеале хотелось бы напрямую читать и записывать структуры данных на диск. В основном у меня есть загрузка 3d-моделей в различных форматах файлов, загрузка которых занимает слишком много времени, поэтому я хочу записать их в «подготовленном» формате в виде кэша, который будет загружаться намного быстрее при последующих запусках программы.
Безопасно ли делать это так?
Мои опасения связаны с непосредственным чтением данных вектора? Я удалил проверку ошибок, жестко запрограммировал 4 как размер int и т. Д., Чтобы я мог привести короткий рабочий пример, я знаю, что это плохой код, мой вопрос на самом деле заключается в том, безопасно ли в c ++ читать весь массив структур прямо в такой вектор? Я полагаю, что это так, но с ++ имеет так много ловушек и неопределенного поведения, когда вы начинаете переходить на низкий уровень и иметь дело непосредственно с необработанной памятью, подобной этой.
Я понимаю, что числовые форматы и размеры могут изменяться на разных платформах и компиляторах, но это может быть прочитано и записано только одной и той же программой компилятора для кэширования данных, которые могут понадобиться при более позднем запуске той же программы.
#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));
}