Здравствуйте, Alexey F, Вы писали:
AF>Судя по имени — std::sort, судя по использованию — std::qsort (скорее, второе). Приведу примеры к обоим:
Поскольку qsort — функция стандартной библиотеки C и не имеет информации о типе элементов сортируемого массива (а только о размере), следует предположить, что она обменивает элементы через memcpy или memmove. Следовательно, её нельзя применять к не-POD-типам. Структура Entry содержит член типа std::string, не являющийся POD-типом.
Здравствуйте, Alexey F, Вы писали:
AF>Судя по имени — std::sort, судя по использованию — std::qsort (скорее, второе). Приведу примеры к обоим:
Не надо приводить примеры для qsort! Она не имеет права сортировать не-POD-ы, потому что вместо честного swap делает побайтовый обмен. А для std::string это может быть разрушительно.
К>Не надо приводить примеры для qsort! Она не имеет права сортировать не-POD-ы, потому что вместо честного swap делает побайтовый обмен. А для std::string это может быть разрушительно.
Здравствуйте, Кодт, Вы писали:
К>Не надо приводить примеры для qsort! Она не имеет права сортировать не-POD-ы, потому что вместо честного swap делает побайтовый обмен. А для std::string это может быть разрушительно.
Упс, точно, там std::string
Извиняюсь, параллельно код на C писал и мне там массив char померещился
Здравствуйте, Alexey F, Вы писали:
AF>const T& и T const& в данном случае (с указателями будут нюансы) эквивалентны, это вопрос привычки
Какие нюансы с указателями? const T* и T const* тоже идентичны.
Здравствуйте, Кодт, Вы писали:
AF>>const T& и T const& в данном случае (с указателями будут нюансы) эквивалентны, это вопрос привычки К>Какие нюансы с указателями? const T* и T const* тоже идентичны.
// вторая версия сообщения[сегодня у меня явно не лады с разъяснениями]
T const* и const T* — конечно эквивалентны. Я имел ввиду:
const T*
T* const// не эквивалентны
Лично меня, когда я узнал впервые про "const справа" это запутало (как считал я вначале — "а, значит, просто переносим const вправо и всё работает"); Решив предупредить об этом человека, спросившего про
Здравствуйте, Кодт, Вы писали:
К>>Не надо приводить примеры для qsort! Она не имеет права сортировать не-POD-ы, потому что вместо честного swap делает побайтовый обмен. А для std::string это может быть разрушительно.
К>http://codepad.org/KfaVSMzf — пример того, как qsort разрушает инвариант объекта. (this->myself==this)
искуственный пример. давайте пример как std::string разрушается.
Здравствуйте, skeptik_, Вы писали:
_>искуственный пример. давайте пример как std::string разрушается.
Запросто. Только на экзотических версиях STL.
Если string содержит буфер для маленькой строки сама в себе, и указатель на буфер — встроенный или внешний.
После побайтового обмена — содержимое буферов обменяется, это правильно, но заодно — строки будут ссылаться не на свои буферы, а перекрёстно. Дальнейшая судьба объектов со сломанным инвариантом туманна и грустна.
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, skeptik_, Вы писали:
_>>искуственный пример. давайте пример как std::string разрушается.
К>Запросто. Только на экзотических версиях STL.
Ещё один искуственный пример skipped. Нормального примера не будет, насколько я понимаю.
Здравствуйте, skeptik_, Вы писали:
_>Ещё один искуственный пример skipped. Нормального примера не будет, насколько я понимаю.
Не такой уж и искусственный. С MSVC вроде как одно время поставлялся STL с такой строкой...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, skeptik_, Вы писали:
К>>Запросто. Только на экзотических версиях STL.
_>Ещё один искуственный пример skipped. Нормального примера не будет, насколько я понимаю.
Это не искусственный пример. Я с таким стрингом работал.
Внутренний буфер резко увеличивает производительность, снимая нагрузку с менеджера памяти.
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, skeptik_, Вы писали:
_>>Ещё один искуственный пример skipped. Нормального примера не будет, насколько я понимаю.
E>Не такой уж и искусственный. С MSVC вроде как одно время поставлялся STL с такой строкой...
Он до сих поставляется со small string optimization. Только делается она не столь нелепо, а через union указателя на внешний buffer и внутреннего buffer.
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, skeptik_, Вы писали:
К>>>Запросто. Только на экзотических версиях STL.
_>>Ещё один искуственный пример skipped. Нормального примера не будет, насколько я понимаю.
К>Это не искусственный пример. Я с таким стрингом работал.
Это конечно не исключено, что какой-то ССЗБ такое написал, но обычно это делается через юнион.
C>Поскольку qsort — функция стандартной библиотеки C и не имеет информации о типе элементов сортируемого массива (а только о размере), следует предположить, что она обменивает элементы через memcpy или memmove. Следовательно, её нельзя применять к не-POD-типам. Структура Entry содержит член типа std::string, не являющийся POD-типом.
Кстати, распространенное заблуждение. POD здесь не при чем. Здесь важно лишь можно ли объект перемещать в памяти или нет. Существуют не POD-типы, которые можно перемещать, и POD-типы, которые нельзя перемещать (например, если в структуре имеется указатель, указывающий на одно из полей этой же структуры). Можно ли перемещать std::string, зависит от его реализации, вполне может быть, что можно.