Dziękuję @MarekR22 za odpowiedź.
Problem polega na tym, że ułożenie elementów w strukturze lub klasie zależy od tego jak kompilator jest ustawiony.
najcześciej kompilator próbuje tak ułożyć elementy, by zachowując ich kolejność uzyskać jak największą wydajność.
Efekt jest taki, że int
może być równany do słowa (dw bajty), lub podwójnego słowa.
Dlatego taki hurtowy zapis binarny jest obciążony dużym ryzykiem i trzeba się przy nim bardzo pilnować!
Ale, jeśli dobrze rozumiem, jeśli ten sam program będzie zapisywał dane do pliku i je później odczytywał tj. skompilowany tym samym kompilatorem z takimi samymi ustawieniami, to rozumiem, że jest to bezpieczne? Bo wówczas zarówno przy zapisie jak i odczycie klasa będzie tak samo wyrównana i odczyt powinien przypisać tym samym zmiennym te same wartości (nawet jak będą w zmienionej kolejności/wielkości)?
Ogólnie to problem jest tego typu, że piszę aplikację, która będzie korzystać ze stosunkowo dużego zbioru danych (około 1 GB) i chcę je wszystkie ładować do RAM-u w miarę szybko. Z pliku tekstowego trwa to stosunkowo długo i chcę to przyśpieszyć zapisując dane do pliku binarnego.
Moja klasa zapisująca i odczytująca dane na chwilę obecną wygląda następująco:
vector<MyData> m_data;
void SaveDataBinary(string filename)
{
size_t tmp_size = m_data.size();
ofstream fout(filename, ios::binary);
fout.write((char *)(&tmp_size), sizeof(tmp_size));
fout.write((char *)(&m_data[0]), sizeof(MyData)*tmp_size);
fout.close();
}
void LoadDataBinary(string filename)
{
size_t tmp_size = 0;
ifstream fin(filename, ios::binary);
fin.read((char *)(&tmp_size), sizeof(size_t));
m_data.resize(tmp_size);
fin.read((char *)(&m_data[0]), sizeof(MyData)*tmp_size);
}
Jeśli jest taka możliwość to również proszę o komentarz, czy jest ok ;-).