Re[3]: Небольшой вопрос по коллекциям
От: _Dreamer Россия  
Дата: 06.12.07 05:58
Оценка: 3 (1)
Здравствуйте, rabusta, Вы писали:

_D>>если имеется ввиду std::vector<> с аллокатором по умолчанию, то где бы он сам не создавался, данные хранятся все равно в куче.

R>а вон оно как, не знал, спасибо, ну тогда еще вот, а если свой кокой контейнер и внутри него массив объявленный как в стеке, и в него копирую объекты, тогда где будут объекты, причем сам контейнер создается в куче?

struct data
{
  int a, b;
  double d;
};

/* контейнер с фиксированным размером */
struct fixed_size_cont
{
  static const size_t BUFFER_SIZE = 128;

  data buffer[BUFFER_SIZE];
  size_t actual_size;

  // нет никакого самостоятельного выделения памяти.
  fixed_size_cont() {}

  // необходимые методы, псевдокод
  void push_back( const data& elem )
  {
    if ( this->actual_size < BUFFER_SIZE )
      this->buffer[this->actual_size++] = elem;
  }

};

// 1 вариант
//...
fixed_size_cont cont; // размещение на стеке контейнера. буфер его располагается там же
data elem; // структура первоначально размещена в стеке
cont.push_back( elem ); // копируется тоже в стек
data * pelem = new data(); // первоначально в куче
cont.push_back( *pelem ); // копируется по прежнему в стек

// 2й вариант
//...
fixed_size_cont * cont = new fixed_size_cont(); // размещение и контейнера и его буфера в куче
data elem; // структура первоначально размещена в стеке
cont->push_back( elem ); // копируется в кучу, так как именно там расположен буфер контейнера
data * pelem = new data(); // первоначально в куче
cont->push_back( *pelem ); // копируется по прежнему в кучу

/* контейнер с динамическим буфером*/
struct dynaic_size_cont
{
  data * buffer;
  size_t size;

  // выделим память в куче для буфера, неважно, как именно был создан сам контейнер.
  dynaic_size_cont( size_t buffre_size ) : buffer(NULL), size(0)
  {
    this->buffer = new data[buffer_size];
    this->size = buffer_size;
  }

  // необходимые методы
  void push_back( const data& elem )
  {
    // добавить новый элемент в буфер
  }
};

// 1 вариант
//...
dynaic_size_cont cont(10); // размещение на стеке самого контейнера и выделение им памяти в куче под 10 элементов
data elem; // структура первоначально размещена в стеке
cont->push_back( elem ); // копируется в буфер контейнера, тоесть в кучу.
data * pelem = new data(); // первоначально в куче
cont->push_back( *pelem ); // копируется по прежнему в кучу

// 2й вариант
//...
dynaic_size_cont * cont = new dynaic_size_cont(20); // размещение и контейнера и его буфера в куче
data elem; // структура первоначально размещена в стеке
cont->push_back( elem ); // копируется в кучу, так как именно там расположен буфер контейнера
data * pelem = new data(); // первоначально в куче
cont->push_back( *pelem ); // копируется по прежнему в кучу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.