Отправляет email-рассылки с помощью сервиса Sendsay

За 2013-10-05

[prg] Re[5]: как привести std::string к c-строкам

Здравствуйте, "i_chay".
> А есть ли реализации, где данные в std::string хранятся в фрагментарно?
Поскольку на уровне стандарта обратное не доказано, т.е. не закреплена
непрерывность, следует исходить из этого.
> Понятно, что можно создать кастомный allocator с изощрённой логикой
> управления
> памятью (но на такой allocator стоит возложить ответственность за
> дефрагментацию
> памяти).
> А на практике есть ли реализации stl с фрагментарными данными?
"...контейнер string не гарантирует хранения данных в непрерывном блоке
памяти" (http://cpp.com.ru/meyers/ch2.html). Более продвинутый источник
сходу не нашёлся.
Как я понимаю, фокус в том, что большинство реализаций, действительно, всё
делает непрерывным блоком, но на уровне стандарта (по крайней мере, так было
до последнего времени) это не закреплено, и я встречал упоминания
реализаций, где это вроде не так. Однако на практике я с этим никогда не
сталкивался, правда я в принципе не знаток извращений в этой области, но
думаю, что людям нет резона врать.
Успехов. Никита.

   2013-10-05 20:06:03 (#2840006)

[prg] Re[4]: как привести std::string к c-строкам

Приветствую всех.

> char* ptr = &test[0];

Вероятнее всего, это будет тот же самый адрес, что и при вызове c_str().

> string::c_str()
> обязан вернуть указатель на C-строку эквивалентную тому значению, что хранит
в себе сам string.

А в случае test[0] тоже должен построить эквивалентную C-строку?

> Ну а если string хранит данные не в непрерывном блоке
> памяти,

А есть ли реализации, где данные в std::string хранятся в фрагментарно?
Понятно, что можно создать кастомный allocator с изощрённой логикой управления
памятью (но на такой allocator стоит возложить ответственность за дефрагментацию
памяти).
А на практике есть ли реализации stl с фрагментарными данными?

   "i_chay" 2013-10-05 19:42:17 (#2839997)

[prg] Re[3]: как привести std::string к c-строкам

Здравствуйте, "i_chay".
>> Самое простое - через метод string::c_str()
> А какие ещё варианты?
int main() {
std::string test("hello");
char* ptr = &test[0];
std::cout<<ptr<<std::endl;
return 0;
}
Только давайте без мата. :-)
> С этого места поподробнее, пожалуйста... О каких блоках памяти и строках
> идёт
> речь?
Ну насколько я теоретически осведомлён в этом вопросе, string::c_str()
обязан вернуть указатель на C-строку эквивалентную тому значению, что хранит
в себе сам string. Ну а если string хранит данные не в непрерывном блоке
памяти, то ему нужно будет проделать ряд манипуляций по созданию такого
блока, а значит последуют дополнительные затраты.
Правда, вы наверное сейчас будете меня убивать по средством
std::vector<char>, который может по требованию всегда хранить данные в
непрерывном блоке. Но здесь мне уже нечего сказать. :-)
(Готовых ссылок нет. Разве что на какой-нибудь пеонерский форум, откуда я
этого и набрался.)
Успехов. Никита.

   2013-10-05 17:44:08 (#2839923)

[prg] Re[2]: как привести std::string к c-строкам

Приветствую всех.

> Самое простое - через метод string::c_str()

А какие ещё варианты?

> Но если строки у вас не в непрерывном блоке памяти, то может значительно
> просесть производительность.

С этого места поподробнее, пожалуйста... О каких блоках памяти и строках идёт
речь?

Успехов. Анатолий.

   "i_chay" 2013-10-05 17:16:48 (#2839902)