Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / еще вопрос по STL / 10 сообщений из 10, страница 1 из 1
25.10.2007, 12:45:39
    #34893997
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
еще вопрос по STL
Класс vector (для примера), когда вызывается push_back() то он выделяет динамическую память и выполняет копирование помещаемого объекта в эту память (если я правильно понял).
Т.е. накладные расходы с выделением памяти и копированием. Можно, наверно, хранить не копии объектов, а только указатели на них. Но тогда придется объекты удалять вручную, а операция выделения памяти по-прежнему будет выполняться.
Вопрос: если ли способ помещать, например, в vector уже динамически-созданные объекты так, чтобы он не производил их повторное копирование и выделение памяти, но производил удаление самостоятельно?
...
Рейтинг: 0 / 0
25.10.2007, 12:52:07
    #34894028
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
еще вопрос по STL
TubrikКласс vector (для примера), когда вызывается push_back() то он выделяет динамическую память и выполняет копирование помещаемого объекта в эту память (если я правильно понял).
Т.е. накладные расходы с выделением памяти и копированием. Можно, наверно, хранить не копии объектов, а только указатели на них. Но тогда придется объекты удалять вручную, а операция выделения памяти по-прежнему будет выполняться.
Вопрос: если ли способ помещать, например, в vector уже динамически-созданные объекты так, чтобы он не производил их повторное копирование и выделение памяти, но производил удаление самостоятельно?

если в деструкторе класса массива указателей прописать нечто цикла, который пробегал бы по все элементам и вызывал

delete item;

или же при удалении объекта из массива попутно вызывать и delete для него
...
Рейтинг: 0 / 0
25.10.2007, 13:11:55
    #34894107
еще вопрос по STL
TubrikКласс vector (для примера), когда вызывается push_back() то он выделяет динамическую память и выполняет копирование помещаемого объекта в эту память (если я правильно понял).
Т.е. накладные расходы с выделением памяти и копированием. Можно, наверно, хранить не копии объектов, а только указатели на них. Но тогда придется объекты удалять вручную, а операция выделения памяти по-прежнему будет выполняться.
Вопрос: если ли способ помещать, например, в vector уже динамически-созданные объекты так, чтобы он не производил их повторное копирование и выделение памяти, но производил удаление самостоятельно?
Можно хранить в векторе т.н. "умные" указатели, которые ведут подсчет ссылок и разрушают объект автоматически, когда счетчик ссылок обнуляется (в конструкторах и операторах присваивания они увеличивают счетчик ссылок, а в десктрукторах - уменьшают). Есть масса разновидностей готовых библиотек таких указателей. Очень распространены boost::shared_ptr, boost::intrusive_ptr (для COM-объектов микрософтовские: com_ptr и ATL::CComPtr). Насчет vector::push_back: наверное, все реализации STL резервируют память для вектора, так что при добавлении в конец количество выделений памяти растет логарифмически от количества добавляемых элементов (т.е. очень медленно).
...
Рейтинг: 0 / 0
25.10.2007, 13:16:37
    #34894130
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
еще вопрос по STL
Cerebrum
если в деструкторе класса массива указателей прописать нечто цикла, который пробегал бы по все элементам и вызывал

delete item;

или же при удалении объекта из массива попутно вызывать и delete для него

Вообще я не совсем об этом спросил..
Деструкторе класса массива (например vector) вы предлагаете переопределить? А зачем, там же уже реалиовано удаление объектов?
...
Рейтинг: 0 / 0
25.10.2007, 13:20:31
    #34894161
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
еще вопрос по STL
TubrikКласс vector (для примера), когда вызывается push_back() то он выделяет динамическую память и выполняет копирование помещаемого объекта в эту память (если я правильно понял).
Т.е. накладные расходы с выделением памяти и копированием. Можно, наверно, хранить не копии объектов, а только указатели на них. Но тогда придется объекты удалять вручную, а операция выделения памяти по-прежнему будет выполняться.
Вопрос: если ли способ помещать, например, в vector уже динамически-созданные объекты так, чтобы он не производил их повторное копирование и выделение памяти, но производил удаление самостоятельно?

Есть способ: использовать умные указатели, например, такие как boost:shared_ptr или свой аналог с коррекной семантикой копирования:

Код: plaintext
1.
std::vector<boost::shared_ptr<my_object> > vec;
...
Рейтинг: 0 / 0
25.10.2007, 13:21:04
    #34894165
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
еще вопрос по STL
TubrikКласс vector (для примера), когда вызывается push_back() то он выделяет динамическую память и выполняет копирование помещаемого объекта в эту память (если я правильно понял).
Т.е. накладные расходы с выделением памяти и копированием. Можно, наверно, хранить не копии объектов, а только указатели на них. Но тогда придется объекты удалять вручную, а операция выделения памяти по-прежнему будет выполняться.
Вопрос: если ли способ помещать, например, в vector уже динамически-созданные объекты так, чтобы он не производил их повторное копирование и выделение памяти, но производил удаление самостоятельно?

1. reserve
2. shared_ptr
...
Рейтинг: 0 / 0
25.10.2007, 13:27:00
    #34894198
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
еще вопрос по STL
Tubrik Cerebrum
если в деструкторе класса массива указателей прописать нечто цикла, который пробегал бы по все элементам и вызывал

delete item;

или же при удалении объекта из массива попутно вызывать и delete для него

Вообще я не совсем об этом спросил..
Деструкторе класса массива (например vector) вы предлагаете переопределить? А зачем, там же уже реалиовано удаление объектов?
я решил что по аналогии собираешся писать свой класс...
...
Рейтинг: 0 / 0
25.10.2007, 13:28:14
    #34894205
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
еще вопрос по STL
Павел Палло[
Можно хранить в векторе т.н. "умные" указатели, которые ведут подсчет ссылок и разрушают объект автоматически, когда счетчик ссылок обнуляется (в конструкторах и операторах присваивания они увеличивают счетчик ссылок, а в десктрукторах - уменьшают).

Как раз начала активно использовать их..

Мне не столько смущает, что вектор выделяет свою память для хранения помещаемых объектов, сколько сам момент копирования этих объектов, т.к. это может быть очень накладно.

Видимо единственных выход - это хранить указатели на помещаемы объекты (обычные или автоматические, чтобы самому не удалять).

-----------------------------------------------------
Попутный вопрос, библиотека tr1 еще не включена в С++ ?
...
Рейтинг: 0 / 0
25.10.2007, 13:29:47
    #34894214
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
еще вопрос по STL
Tubrik Павел Палло[
Можно хранить в векторе т.н. "умные" указатели, которые ведут подсчет ссылок и разрушают объект автоматически, когда счетчик ссылок обнуляется (в конструкторах и операторах присваивания они увеличивают счетчик ссылок, а в десктрукторах - уменьшают).

Как раз начала активно использовать их..

Мне не столько смущает, что вектор выделяет свою память для хранения помещаемых объектов, сколько сам момент копирования этих объектов, т.к. это может быть очень накладно.

Видимо единственных выход - это хранить указатели на помещаемы объекты (обычные или автоматические, чтобы самому не удалять).

-----------------------------------------------------
Попутный вопрос, библиотека tr1 еще не включена в С++ ?

Как раз начала читать как Как раз начал
...
Рейтинг: 0 / 0
25.10.2007, 13:39:12
    #34894260
еще вопрос по STL
Tubrik Павел Палло
Можно хранить в векторе т.н. "умные" указатели, которые ведут подсчет ссылок и разрушают объект автоматически, когда счетчик ссылок обнуляется (в конструкторах и операторах присваивания они увеличивают счетчик ссылок, а в десктрукторах - уменьшают).

Как раз начала активно использовать их..

Мне не столько смущает, что вектор выделяет свою память для хранения помещаемых объектов, сколько сам момент копирования этих объектов, т.к. это может быть очень накладно.

Видимо единственных выход - это хранить указатели на помещаемы объекты (обычные или автоматические, чтобы самому не удалять).

-----------------------------------------------------
Попутный вопрос, библиотека tr1 еще не включена в С++ ?
Описание новинок в следующей версии стандарта С++ .
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / еще вопрос по STL / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]