![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
SABROG, строка хранится в памяти непрерывно. Это вообщем-то факт (чтобы нормально рабоали c_str и data). Поэтому в классе должен быть только указатель на строку. Никак не сама строка.
|
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
Я писал раньше, что метод capacity() возвращет количество символов, которое может содержать строка изначально. Эксперимент показал, что размеры занимаемой памяти никак не менялся, если я создавал 6 млн.ов пустых строк, или 6 млн.ов строк длинной меньше 15 символов (hello, world). |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Скажи это разработчикам STLport и STL в MS. А то они совсем идиоты. Ещё расскажи им что хранить в классе длину строки не надо. Ибо "только указатель" это наше всё. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
И? То, что во многих реализациях стл память резервируется заранее - это очевидно. Только к sizeof-у сабжевому это не имеет никакого отношения
|
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
плин не получилось впереёд SABROG'а ответить
тьфу блин не склеилось
И где же она резервируется как не внутри класса? Берется из эфира? Это сообщение отредактировал(а) Mayk - 31.7.2008, 13:47 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
в классе хранится указатель на выделенную в куче память. Причем тут объект класса?
и что? это размер выделенной памяти, каким образом это должно показать, что память выделена внутри объекта? |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Mayk!
Добавлено через 1 минуту и 42 секунды Резервируется, короче, она никак не внутри класса. Ибо размер класса статичен, строки - нет. А очень желательно хранить строку непрерывно (иначе - проблем больше будет). Что касается размера буфера, размера строки, аллокаторов, итераторов и пр. - да, это хранится в самом классе. Не только указатель, но никак ни сама строка. Добавлено через 2 минуты и 36 секунд К слову - Dinkumware STL. Платно доступна, кстати, для гцц |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
ну и понаписали вы тут, мне кажется автору топика вовсе не обязательно хранить строки, достаточно хранить в памяти хэш, 32 бита и никакой тебе динамической памяти, указателей и прочего
|
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
Какие алгоритмы могут дать хэш размером в 32 бита ? Я правильно понимаю "хэш" в данном контексте это уникальное значение, которое берется путем математических манипуляций с уникальной строкой. Т.е. если была строка "Hello, World" и я поменяю W на прописную w, то хэш уже будет другой. И хэш будет мне гарантировать, что в базе не появится строка с подобных хешем. Когда я подобное искал, то не нашел алгоритмов с хэшами меньше 128 бит и то они не гарантировали уникальности. В итоге пришел к выводу, что экономнее хранить строки как есть, т.к. хэши даже для однобайтовых строк слишком длинные. |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Хеш - не может быть абсолютно уникальным
Это сообщение отредактировал(а) Любитель - 31.7.2008, 15:03 |
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 20 Всего: 121 |
http://en.wikipedia.org/wiki/Adler-32 Для нескольких миллионов слов пойдёт.
Как они могут гарантировать уникальность? Сколько всего состояний может принять последовательность 128 бит? 2^128. А сколько всего состояний может принять последовательность, например, из 256 бит? Ясно, что 2^256 >> 2^128 и что меньшая последовательность в прицнипе не сможет хранить все состояния первой. Тут вопрос вероятности, а в нормальных хеш-функциях они очень малы, поэтому ими пренебрегают. Это сообщение отредактировал(а) W4FhLF - 31.7.2008, 15:06 -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
||||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
boost::hash пишет хэш в size_t, 2^32 = 4 294 967 296 количество слов = 6 000 000 так что коллизии маловероятны... |
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
Не согласен. Если в цикле нужно проверять размер одной и той же строки, то это расходы на strlen(). Плюс, необходимо знать размер вместимости строки, и предварительно выделять с запасом, чтоб избежать постоянного перевыделения памяти. имхо. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Сделано специально для малых строк. Таким образом малые строки могут храниться в стеке, что может повысить быстродействие. Если длина строки больше некоторого порогового значения, то для хранения символов используется динамическая память.
Для обсуждаемых здесь реализаций факт, стандарт же не гарантирует непрерывность. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |