Хотел задать вопрос больше теоретического плана: как работают распределители памяти? Ну в качестве примера возьму код из моей программы уже приводимый на форуме.
Есть вектор log, каждый элемент которого содержит вектор params, с набором значений параметров.
Когда params был массивом, то в принципе распределение можно сделать уже указанным способом: выделять какому-то буферу большой кусок памяти, а потом "раздавать" эту память массивам params! Т.е. операция выделения памяти будет происходить не на каждой итерации чтения новой записи из файла.
PARAMVALUE* params; /// вместо указанного типа может быть абсолютно любой - сейчас важен принцип работы а не конкретика
// где-то
int param_buf_count = 0;
const int BUFF_SIZE = 2048;
char* param_buff = 0;
// ........................ Код чтения
LOGRECORD t;
if(param_buf_count >= BUFF_SIZE) param_buf_count = 0;
if(param_buf_count == 0)
{
param_buff = new char[rec_descr.size() * BUFF_SIZE];
}
t.params = param_buff + param_buf_count * rec_descr.size();
++param_buf_count;
// какие-то действия с заполнением вектора
std::vector<PARAMVALUE, pool_alloc<PARAMVALUE>> params; /// вектор с собственным распределителем
// ........................ Код чтения
LOGRECORD t(rec_descr.size());
// какие-то действия с заполнением вектора
Ну почитай ты книжки. Распределение памяти - это не тот момент который удобно объяснять на форуме на пальцах.
У того же Страуструпа описано и у Саттера вроде...
Я бы, в подобном случае вообще свой механизм сделал - единый блоковый контейнер для PARAMVALUE и boost::range в LOGRECORD.
Код использования был бы примерно такой:
struct LOGRECORD {
std::pair<PARAMVALUE*, PARAMVALUE*> params; ///< массив параметров
...
};
struct LogReader {
...
bool tRead();
bool parseBlock(LOGRECORD& t);
private:
ParamValueChihkContainer<PARAMVALUE> params;
};
bool LogReader::tRead() {
...
while(_file -> read((char*)&var, sizeof(var)) > 0) {
...
case 0001:
log.append(LOGRECORD(rec_descr.size()));
parseBlock(log.last());
...
return file_read;
}
/// Разбор одной записи
bool LogReader::parseBlock(LOGRECORD& t) {
...
t.params = params.constrict(rec_descr.size())
...
t.params[i] = (*jter) -> GetValue(var);
t.params[i].evn = 0;
...
return true;
}
tymplate <T>
struct ParamValueChihkContainer {
std::pair<T*, T*> constrict(size_t n);
...
};
Саттера дочитываю! Как раз дошел до распределения памяти, но не успел дочитать еще! )))
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)