Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.142.197.198] |
|
Страницы: (32) « Первая ... 25 26 [27] 28 29 ... 31 32 ( Перейти к последнему сообщению ) |
Сообщ.
#391
,
|
|
|
Цитата Олег М @ Только в двух случаях: используется плюсовые аналоги вместо исходных ламповых; если вместо плюсовых аналогов в исходных ламповых изначально были написаны костыли. Речь вроде было о том, что программа на C++ требует подключения большего количества библиотек, чем аналогичная на Си. Добавлено Цитата Олег М @ Только в двух случаях: используется плюсовые аналоги вместо исходных ламповых; если вместо плюсовых аналогов в исходных ламповых изначально были написаны костыли. Речь вроде было о том, что программа на C++ требует подключения большего количества библиотек, чем аналогичная на Си. Цитата Flex Ferrum @ Это проблемы не языка, а средств разработки. Язык подобного не требует, нулевая стоимость как-никак. |
Сообщ.
#392
,
|
|
|
Цитата Qraizer @ Язык подобного не требует, нулевая стоимость как-никак. Раздел language support в стандарте. Возможно, что игрой с опциями компиляции можно полностью выпилить и RTTI, и исключения, и менеджмент памяти. |
Сообщ.
#393
,
|
|
|
Цитата applegame @ Тю, сферический... Ада. Идеальный сферический язык (и компилятор) не должен требовать никаких линтеров и анализаторов. Добавлено Маразм был его отсутствие. void f(int); void f(char*); /* ... */ f(123); Добавлено Цитата Flex Ferrum @ Да, если говорим о гарантиях Стандарта, нет, если вменяемую среду разработки. Но в целом, подобные вещи легко нивелируются интерфейсами, которые проектируются правильно, а не представляют собой винегрет из легаси и мейнстрима. Я тоже сначала так подумал. Потом посмотрел на код вызова (последняя строчка). Тут что-то близкое к UB. Добавлено Цитата Flex Ferrum @ Не обязательно. Вообще же, я даже могу намекнуть на hosted и freestanding. Возможно, что игрой с опциями компиляции можно полностью выпилить и RTTI, и исключения, и менеджмент памяти. |
Сообщ.
#394
,
|
|
|
... but it's too early to put an end on it so far
|
Сообщ.
#395
,
|
|
|
Цитата Qraizer @ Но в целом, подобные вещи легко нивелируются интерфейсами, которые проектируются правильно, а не представляют собой винегрет из легаси и мейнстрима. Допустим. Как разрулить конкретный пример интерфейсами, которые спроектированы правильно? Особенно учитывая, что подобное запросто может встретиться при их реализации. Цитата Flex Ferrum @ Если после push_back в пятой строчке произойдёт реаллокация - то наступит жопа. Я, кстати, так и не понял - является ли формально UB первый push_back, или нет. Но все проверенные компиляторы его выполняют нормально. |
Сообщ.
#396
,
|
|
|
Цитата Flex Ferrum @ Я тоже сначала так подумал. Потом посмотрел на код вызова (последняя строчка). Тут что-то близкое к UB. Если после push_back в пятой строчке произойдёт реаллокация - то наступит жопа. По-моему, жопа там наступит уже в первом push_back. Разве не сначала выделяется память, а потом вызывается конструктор, в данном случае копирования? |
Сообщ.
#397
,
|
|
|
Правда. Перепутал с дартом. Прошу понять. И простить. |
Сообщ.
#398
,
|
|
|
Цитата Олег М @ По-моему, жопа там наступит уже в первом push_back. Разве не сначала выделяется память, а потом вызывается конструктор, в данном случае копирования? Выделяется память, создаётся элемент в нужном месте, перемещаются или копируются элементы из старого массива, вызываются деструкторы, освобождается память. Как-то так. |
Сообщ.
#399
,
|
|
|
Цитата OpenGL @ Зависит от состояния вектора. Надо заполнить вектор до вместимости, а потом выполнить вызов. Желательно, чтобы у элемента был конструктор перемещения или реально разрушающий объект деструктор. Это для того, чтобы разрушенный объект не мог изобразить из себя рабочий. является ли формально UB первый push_back, или нет |
Сообщ.
#400
,
|
|
|
Цитата OpenGL @ Очень простой, но для некоторых очень неожиданный ответ: функция push_twice() хоть с каким интерфейсом вообще не должна существовать в её нынешней реализации. Обоснование: она не удовлетворяет строгой гарантии отказоустойчивости. Если эту её проблему решить, интерфейс внезапно перестанет быть важным фактором. Допустим. Как разрулить конкретный пример интерфейсами, которые спроектированы правильно? Особенно учитывая, что подобное запросто может встретиться при их реализации. |
Сообщ.
#401
,
|
|
|
Цитата Qraizer @ Очень простой, но для некоторых очень неожиданный ответ: функция push_twice() хоть с каким интерфейсом вообще не должна существовать в её нынешней реализации. Обоснование: она не удовлетворяет строгой гарантии отказоустойчивости. Пф. Тогда бы уж сразу сказал "неправильный код не должен писаться" - этот подход избавляет не только от описанной мной, а вообще от любых ошибок Да и с чего бы не должна существовать? std::sort с компаратором по такой логике тоже существовать не должна - поскольку программист в ней может порушить нафиг сортируемый вектор, она не удовлетворяет строгой гарантии отказоустойчивости. Выпиливаем её из С++17? |
Сообщ.
#402
,
|
|
|
Цитата OpenGL @ Прости, я как-то не догадался сказать очевидное. std::sort<>() вообще-то гарантирует строго, push_twice() же предоставляет лишь базовую гарантию, а вызывающая сторона, можно сказать, нарушает даже Стандарт C. О чём тут вообще говорить? К слову, подобные ошибки на ура должны обнаруживаться даже анализаторами, и я не удивлюсь, если и компиляторы такие найдутся. Тогда бы уж сразу сказал "неправильный код не должен писаться" - этот подход избавляет не только от описанной мной, а вообще от любых ошибок |
Сообщ.
#403
,
|
|
|
Цитата Qraizer @ std::sort<>() вообще-то гарантирует строго Эм? Что именно она гарантирует? В процессе сортировки итераторы не должны инвалидироваться, и на этот счёт у std::sort нет и не может быть никаких гарантий - она полагается на то, что программист не сделает это случайно. Это по большому счёту ничем не отличается от требований push_twice. Цитата Qraizer @ К слову, подобные ошибки на ура должны обнаруживаться даже анализаторами, и я не удивлюсь, если и компиляторы такие найдутся. Собственно, анализаторы нужны как раз для того, чтобы отлавливать ошибки, вероятность которых средствами языка ликвидировать не получается. |
Сообщ.
#404
,
|
|
|
Цитата Qraizer @ SFINAE – логическое продолжение этого поведения, только не для параметров функций, а для параметров шаблонов. Я в курсе. И, тем не менее, помогать компилятору помогать тебе контролировать тебе свои типы - нехорошая черта (типизированного) языка. ИМХО. |
Сообщ.
#405
,
|
|
|
Цитата OpenGL @ Но по крайней мере std::sort сама итераторы не портит. В процессе сортировки итераторы не должны инвалидироваться, и на этот счёт у std::sort нет и не может быть никаких гарантий - она полагается на то, что программист не сделает это случайно. Это по большому счёту ничем не отличается от требований push_twice. |