carchive — порядок выполнения переполнения стека

Я создал программу, которая тестирует carchive, Я хотел посмотреть, как быстро удалось сохранить миллион точек данных:

#include "stdafx.h"#include "TestData.h"#include <iostream>
#include <vector>

using namespace std;

void pause() {
cin.clear();
cout << endl << "Press any key to continue...";
cin.ignore();
}

int _tmain(int argc, _TCHAR* argv[])
{
int numOfPoint = 1000000;

printf("Starting test...\n\n");
vector<TestData>* dataPoints = new vector<TestData>();

printf("Creating %i points...\n", numOfPoint);
for (int i = 0; i < numOfPoint; i++)
{
TestData* dataPoint = new TestData();
dataPoints->push_back(*dataPoint);
}
printf("Finished creating points.\n\n");

printf("Creating archive...\n");
CFile* pFile = new CFile();
CFileException e;
TCHAR* fileName = _T("foo.dat");
ASSERT(pFile != NULL);
if (!pFile->Open(fileName, CFile::modeCreate | CFile::modeReadWrite | CFile::shareExclusive, &e))
{
return -1;
}

bool bReading = false;
CArchive* pArchive = NULL;
try
{
pFile->SeekToBegin();
UINT uMode = (bReading ? CArchive::load : CArchive::store);
pArchive = new CArchive(pFile, uMode);
ASSERT(pArchive != NULL);
}
catch (CException* pException)
{
return -2;
}
printf("Finished creating archive.\n\n");

//SERIALIZING DATA
printf("Serializing data...\n");
for (int i = 0; i < dataPoints->size(); i++)
{
dataPoints->at(i).serialize(pArchive);
}
printf("Finished serializing data.\n\n");

printf("Cleaning up...\n");
pArchive->Close();
delete pArchive;
pFile->Close();
delete pFile;
printf("Finished cleaning up.\n\n");

printf("Test Complete.\n");

pause();

return 0;
}

Когда я запускаю этот код, на создание точек данных уходит некоторое время, но затем он проходит практически весь остальной код. Тем не менее, мне нужно подождать около 4 минут, чтобы приложение действительно завершило работу. Я бы предположил, что приложение будет ожидать зависания в части данных сериализации, как это происходило при создании точек данных.

Поэтому мой вопрос о том, как это на самом деле работает. Есть ли carchive сделать свое дело в отдельном потоке и разрешить выполнение остальной части кода?

Я могу предоставить больше информации, если это необходимо.

0

Решение

Если вы хотите создать вектор с миллионом элементов, инициализированных по умолчанию, просто используйте эту версию конструктора.

vector<TestData> dataPoints{numOfPoint};

Ты должен остановиться newВо всём, позвольте RAII провести очистку для вас.

Также знайте, что push_back требует resize вашего вектора, если его емкость недостаточно велика, поэтому, если вы начинаете с пустого вектора и знаете, насколько большим он будет в конце, вы можете использовать reserve досрочно.

vector<TestData> dataPoints;
dataPoints.reserve(numOfPoint);
for (int i = 0; i < numOfPoint; i++)
{
dataPoints->push_back(TestData{});
}
4

Другие решения


По вопросам рекламы [email protected]