Форум программистов, компьютерный форум CyberForum.ru

Вопрос по string'у - C++

Восстановить пароль Регистрация
 
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
01.05.2011, 17:59     Вопрос по string'у #1
Насколько мне известно, string резервирует память, как и вектор... Если это так, возможно ли отключить резервирование, т.к. в ходе работы приложения содержимое будет добавлено всего один раз и дальше будет происходить только считывание?
Или может есть какая-та более оптимальная по памяти и скорости альтернатива стрингу в таких случаях?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ma3a
Эксперт C++
612 / 456 / 31
Регистрация: 28.01.2011
Сообщений: 605
01.05.2011, 18:10     Вопрос по string'у #2
Он резервирует дополнительную память только когда старая кончилась при добавлении элементов. Раз вы ничего не собираетесь менять , присвоив значение лишь один раз, так и зарезервируйте ровно столько, сколько нужно, и ничего дополнительно резервироваться не будет(либо сразу же в конструкторе нужную строку присвойте и памяти будет выделено сколько надо).
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
01.05.2011, 18:38  [ТС]     Вопрос по string'у #3
А резервировать нужно ровно столько, сколько символов в строке или сколько символов в строке + нул-байт?

Он резервирует дополнительную память только когда старая кончилась при добавлении элементов
Всмысле только когда добавляемый элемент уже не умещается или же и когда добавляемый элемент занял всю выделенную память, но уместился?
Ma3a
Эксперт C++
612 / 456 / 31
Регистрация: 28.01.2011
Сообщений: 605
01.05.2011, 18:46     Вопрос по string'у #4
Цитата Сообщение от Union Посмотреть сообщение
А резервировать нужно ровно столько, сколько символов в строке или сколько символов в строке + нул-байт?
В случае, если передается явная строковая константа, то нуль-символ учитывать не стоит, внутри вычисляется актуальная длина строки и дальше обычно с помощью memcpy идет копирование без учета нуль-символа.
Цитата Сообщение от Union Посмотреть сообщение
Всмысле только когда добавляемый элемент уже не умещается или же и когда добавляемый элемент занял всю выделенную память, но уместился?
когда уже не уместился.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
01.05.2011, 18:48     Вопрос по string'у #5
Union, Только когда не умещается вестимо.

C++
1
2
3
4
5
6
7
8
9
    void __CLR_OR_THIS_CALL reserve(size_type _Newcap = 0)
        {   // determine new minimum length of allocated storage
        if (_Mysize <= _Newcap && _Myres != _Newcap)
            {   // change reservation
            size_type _Size = _Mysize;
            if (_Grow(_Newcap, true))
                _Eos(_Size);
            }
        }
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    bool __CLR_OR_THIS_CALL _Grow(size_type _Newsize,
        bool _Trim = false)
        {   // ensure buffer is big enough, trim to size if _Trim is true
            if (max_size() < _Newsize)
            _String_base::_Xlen();  // result too long
        if (_Myres < _Newsize)
            _Copy(_Newsize, _Mysize);   // reallocate to grow
        else if (_Trim && _Newsize < _BUF_SIZE)
            _Tidy(true, // copy and deallocate if trimming to small string
                _Newsize < _Mysize ? _Newsize : _Mysize);
        else if (_Newsize == 0)
            _Eos(0);    // new size is zero, just null terminate
        return (0 < _Newsize);  // return true only if more work to do
        }
C++
1
2
3
4
    void __CLR_OR_THIS_CALL _Eos(size_type _Newsize)
        {   // set new length and null terminator
        _Traits::assign(_Myptr()[_Mysize = _Newsize], _Elem());
        }
Сие из MSVS.
Yandex
Объявления
01.05.2011, 18:48     Вопрос по string'у
Ответ Создать тему
Опции темы

Текущее время: 17:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru