Здравствуйте, 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 ); // копируется по прежнему в кучу
Есть небольшой, простой вопросец, прошу сильно не пинать, вот допустим есть вектор и он создается в куче, и хранит не указатели, а сами объекты некоторого класса. Потом мы создаем объект в стеке и помещаем его в вектор, вектор копирует его себе, вот у меня такой вопрос, где теперь наш объект вектор его скопировал в кучу или в стек?
Здравствуйте, rabusta, Вы писали:
R>Есть небольшой, простой вопросец, прошу сильно не пинать, вот допустим есть вектор и он создается в куче, и хранит не указатели, а сами объекты некоторого класса. Потом мы создаем объект в стеке и помещаем его в вектор, вектор копирует его себе, вот у меня такой вопрос, где теперь наш объект вектор его скопировал в кучу или в стек?
если имеется ввиду std::vector<> с аллокатором по умолчанию, то где бы он сам не создавался, данные хранятся все равно в куче.
_D>если имеется ввиду std::vector<> с аллокатором по умолчанию, то где бы он сам не создавался, данные хранятся все равно в куче.
а вон оно как, не знал, спасибо, ну тогда еще вот, а если свой кокой контейнер и внутри него массив объявленный как в стеке, и в него копирую объекты, тогда где будут объекты, причем сам контейнер создается в куче?