Как заставить векторор не освобождать память
От: Аноним  
Дата: 06.09.05 07:51
Оценка:
Мне надо чтоб он расширялся при необходимости,
но никогда память не сбрасывал,
но нужно чтоб очищался логически, т.е.
push начинался сначала после очистки но в туже память,
это возможно?

06.09.05 12:06: Перенесено из 'C/C++. Прикладные вопросы'
Re: Как заставить векторор не освобождать память
От: Gleb Alexeev  
Дата: 06.09.05 08:01
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Мне надо чтоб он расширялся при необходимости,

А>но никогда память не сбрасывал,
А>но нужно чтоб очищался логически, т.е.
А>push начинался сначала после очистки но в туже память,
А>это возможно?

Он так и работает. Про "в ту же память" гарантий нет, но если capacity() достаточная, то перераспределения памяти при вставке не происходит.
Re: Как заставить векторор не освобождать память
От: Кодт Россия  
Дата: 06.09.05 08:05
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Мне надо чтоб он расширялся при необходимости,

А>но никогда память не сбрасывал,
А>но нужно чтоб очищался логически, т.е.
А>push начинался сначала после очистки но в туже память,
А>это возможно?

Возможно. Зарезервируй достаточно места (capacity()) под элементы через reserve(N); — и пока size() <= capacity(), память не будет сброшена.
Перекуём баги на фичи!
Re: Как заставить векторор не освобождать память
От: Glоbus Украина  
Дата: 06.09.05 08:24
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Мне надо чтоб он расширялся при необходимости,

А>но никогда память не сбрасывал,
А>но нужно чтоб очищался логически, т.е.
А>push начинался сначала после очистки но в туже память,
А>это возможно?

Я думаю возможно, елси очищать его через erase().
Удачи тебе, браток!
Re[2]: Как заставить векторор не освобождать память
От: Gleb Alexeev  
Дата: 06.09.05 08:28
Оценка:
Здравствуйте, Glоbus, Вы писали:

G>Я думаю возможно, елси очищать его через erase().


Чтобы емкость массива не уменьшалась, не нужно предпринимать совершенно ничего. Вот наоборот, чтобы освободить память, нужно извернуться (скопировать в другой вектор и обменяться с ним через swap; в случае пустого вектора, естественно, копировать не нужно).
Re[3]: Как заставить векторор не освобождать память
От: Glоbus Украина  
Дата: 06.09.05 09:01
Оценка:
Здравствуйте, Gleb Alexeev, Вы писали:

GA>Здравствуйте, Glоbus, Вы писали:


G>>Я думаю возможно, елси очищать его через erase().


GA>Чтобы емкость массива не уменьшалась, не нужно предпринимать совершенно ничего.


А если я сделаю clear() вектор не освобождает память?
Удачи тебе, браток!
Re[4]: Как заставить векторор не освобождать память
От: srggal Украина  
Дата: 06.09.05 09:09
Оценка: +1 -1
Здравствуйте, Glоbus, Вы писали:

G>Здравствуйте, Gleb Alexeev, Вы писали:


GA>>Здравствуйте, Glоbus, Вы писали:


G>>>Я думаю возможно, елси очищать его через erase().


GA>>Чтобы емкость массива не уменьшалась, не нужно предпринимать совершенно ничего.


G>А если я сделаю clear() вектор не освобождает память?


Нет не освободит, перерераспределение памяти произойдет при вставке и только в случае если:
        vec.size() < vec.capacity()
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[5]: Как заставить векторор не освобождать память
От: srggal Украина  
Дата: 06.09.05 09:14
Оценка:
Здравствуйте, srggal, Вы писали:


S>Нет не освободит, перерераспределение памяти произойдет при вставке и только в случае если:

S>
S>        vec.size() < vec.capacity()
S>


ГМ. виноват


При clear — произойдет освобождение памяти вот что в STL от M$:
.....
    void clear()
        {    // erase all
        _Tidy();
        }
....
    void _Tidy()
        {    // free all storage
        if (_Myfirst != 0)
            {    // something to free, destroy and deallocate it
            _Destroy(_Myfirst, _Mylast);
            this->_Alval.deallocate(_Myfirst, _Myend - _Myfirst);
            }
        _Myfirst = 0, _Mylast = 0, _Myend = 0;
        }
....
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[5]: Как заставить векторор не освобождать память
От: Glоbus Украина  
Дата: 06.09.05 09:15
Оценка:
Здравствуйте, srggal, Вы писали:

S>Здравствуйте, Glоbus, Вы писали:


G>>Здравствуйте, Gleb Alexeev, Вы писали:


GA>>>Здравствуйте, Glоbus, Вы писали:


G>>>>Я думаю возможно, елси очищать его через erase().


GA>>>Чтобы емкость массива не уменьшалась, не нужно предпринимать совершенно ничего.


G>>А если я сделаю clear() вектор не освобождает память?


S>Нет не освободит, перерераспределение памяти произойдет при вставке и только в случае если:

S>
S>        vec.size() < vec.capacity()
S>


Я вот тут посмотрел исходники стл для ВС 7.1 и там есть такой метод, который вызывает clear()

    void _Tidy()
        {    // free all storage
        if (_Myfirst != 0)
            {    // something to free, destroy and deallocate it
            _Destroy(_Myfirst, _Mylast);
            this->_Alval.deallocate(_Myfirst, _Myend - _Myfirst);            }
        _Myfirst = 0, _Mylast = 0, _Myend = 0;
        }

Интересует выделенная строчка — что она "деаллоцирует"?
Удачи тебе, браток!
Re[4]: Как заставить векторор не освобождать память
От: Dirichlet Россия  
Дата: 06.09.05 09:18
Оценка: +1
Здравствуйте, Glоbus, Вы писали:

G>А если я сделаю clear() вектор не освобождает память?


В стандарте сказано, что не должен.
Но проблема в том, что реализация STL, поставляемая с Visual Studio, память очищает.

#include <vector>
#include <iostream>
int main( )
{              
    std::vector< int > x;
    x.push_back( 0 );
    x.push_back( 1 );
    std::cout << "x.size( ) = " << x.size( ) << ", x.capacity( ) = " << x.capacity( ) << std::endl;
    x.clear( );
    std::cout << "x.size( ) = " << x.size( ) << ", x.capacity( ) = " << x.capacity( ) << std::endl;
    return 0;
}


Эта программка ясно показывает, очищает ли std::vector память или нет в Вашей реализации STL.

С другой стороны конструкция
   x.erase( x.begin( ), x.end( ) );
,
которая должна быть по стандарту синонимом x.clear( ), в реализации STL от Visual Studio память не очищает.

Еще один вариант —
    x.resize( 0 );

память также не очищает.
Re[6]: Как заставить векторор не освобождать память
От: srggal Украина  
Дата: 06.09.05 09:21
Оценка:
Здравствуйте, Glоbus, Вы писали:


S>>Нет не освободит, перерераспределение памяти произойдет при вставке и только в случае если:

S>>
S>>        vec.size() < vec.capacity()
S>>


G>Я вот тут посмотрел исходники стл для ВС 7.1 и там есть такой метод, который вызывает clear()


G>
G>    void _Tidy()
G>        {    // free all storage
G>        if (_Myfirst != 0)
G>            {    // something to free, destroy and deallocate it
G>            _Destroy(_Myfirst, _Mylast);
G>            this->_Alval.deallocate(_Myfirst, _Myend - _Myfirst);            }
G>        _Myfirst = 0, _Mylast = 0, _Myend = 0;
G>        }

G>

G>Интересует выделенная строчка — что она "деаллоцирует"?

Я сражу же поправился здесь
Автор: srggal
Дата: 06.09.05


Единственнный способ (ИМХО) — реализовать свой аллокатор, который не будет освобождать память при deallocate()
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[7]: Как заставить векторор не освобождать память
От: Dirichlet Россия  
Дата: 06.09.05 09:24
Оценка:
Здравствуйте, srggal, Вы писали:

S>Единственнный способ (ИМХО) — реализовать свой аллокатор, который не будет освобождать память при deallocate()


Можно просто использовать .resize( 0 ) вместо .clear( ).
Re[5]: Как заставить векторор не освобождать память
От: srggal Украина  
Дата: 06.09.05 09:27
Оценка:
Здравствуйте, Dirichlet, Вы писали:

D>Здравствуйте, Glоbus, Вы писали:


G>>А если я сделаю clear() вектор не освобождает память?


D>В стандарте сказано, что не должен.


Из стандарта:

Table 67—Sequence requirements (in addition to container)

expression return type

a.clear() void erase(begin(), end()) post: size() == 0
...,



Зря тока минус словил
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[8]: Как заставить векторор не освобождать память
От: srggal Украина  
Дата: 06.09.05 09:34
Оценка:
Здравствуйте, Dirichlet, Вы писали:

D>Можно просто использовать .resize( 0 ) вместо .clear( ).


100 согласен, но только в том случае если позволяют условия задачи, и все клиенты вектора будут "знать" что вместо .clear() следует вызывать .resize( 0 ).

А если нет ?

В любом случае Решения найдены и выброр за автором темы
... << RSDN@Home 1.1.4 stable rev. 510>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.