загрузка обьектов из файла
От: _Dreamer Россия  
Дата: 18.09.06 07:06
Оценка:
здравствуйте.

ситуация — есть большая куча не очень больших файлов, в каждом из которых хранится описание некоторого обьекта.
у каждого обьекта есть базовый тип и некоторый подтип. в соответствии с типом и подтипом различаются данные обьекта.
соответственно, у меня получается примерно такая реализация —
enum object_types
{
  type1 = 0,
  type2 = 1
};

enum sub_types
{
  subtype1 = 10,
  sybtype2 = 20
};

struct base 
{
  int id;
  int type;
};

struct obj_type1 : public base
{
  int some_data;
  char other_data[ 64 ];
  int subtype;
};

struct obj_type1_subtype1 : obj_type1
{
  int some_sub_data[ 128 ];
};

struct obj_type2 : public base
{
  int int_array[32];
  int value1;
  int value2;
  int subtype;
};

struct obj_type2_subtype2 : obj_type2
{
  char some_sub_data[ 12 ];
};


ситуация чрезвычайно упрощена, дабы не загромождать пост.
структуры обьектов соответсвуют данным, хранящимся в файлах.
задача — загрузить кучу обьектов из кучи файлов. десереализовать так сказать
меня интересует, как можно решить такую задачу с минимизацией расхода памяти при загрузке.

сейчас делается влоб —
base * load_subtype1( istream& file, const obj_type1& o1 )
{
  obj_type1_subtype1 * os2( o1 );
  file >> *os2;

  return os2;
}

base * load_type1( istream& file, const base& b )
{
  obj_type1 o1( b );
  file >> o1;

  switch( o1.subtype )
  {
    case subtype1 : return load_subtype1( file, o1 );
    case subtype2 : return load_subtype2( file, o1 );
  }
}

base * load( istream& file )
{
  base b;
  file >> b;

  switch( b.type )
  {
    case type1 : return load_type1( file, base );
    case type2 : return load_type2( file, base );
  }
}


мне очень не нравятся расходы на создание обьектов и копирование при конструировании.
но создать обьект 1 раз и просто последовательно читать в него из файла я не могу, ибо не знаю, что же за обьект получу, пока не прочитаю данные из файла.
если огранизовать структуру данных не с наследованием, а с аггрегированием, то вроде копирования можно избежать. но вот работать с такими обьектами не слишком удобно.
struct base 
{
  int id;
  int type;

  void * tail;
};

struct obj_type1
{
  int some_data;
  char other_data[ 64 ];
  int subtype;

  void * tail;
};

struct obj_type1_subtype1
{
  int some_sub_data[ 128 ];
};

base * load_subtype1( istream& file, base * b )
{
  obj_type1_subtype1 * os1 = new obj_type1_subtype1();
  file >> *os1;
  ((obj_type1 *)b->tail)->tail = os1;

  return b;
}

base * load_type1( istream& file, base* b )
{
  obj_type1 * o1 = new obj_type1();
  file >> *o1;
  b->tail = o1;

  switch( o1->subtype )
  {
    case subtype1 : return load_subtype1( file, b );
  }
}

base * load( istream& file )
{
  base * b = new base();
  file >> *b;

  switch( b->type )
  {
    case type1 : return load_type1( file, base );
  }
}


если кто все это прочитал, осилил, тысызыть, буду благодарен за советы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.