LINUX.ORG.RU
ФорумTalks

Опрос: Три-пять лучших фич C++

 , ,


3

4

Поскольку я с недавних пор устроился на работу, то простыни временно закончились. Тем не менее, каждый раз при работе с сишным кодом снова и снова всплывает мысль «блин, как же здесь не фатает крестов». Но в остальном сишки мне более чем хватает, мне не нужны геттеры-сеттеры, классы-интерфейсы под single responsibility, и прочая мура. Пару источников вдохновения:

https://google.github.io/styleguide/cppguide.html
https://yosefk.com/c fqa/

Итак, назовите от трех до пяти фич крестов, которые бы вы взяли с собой на необитаемый остров Си. Можно несуществующие или из будущих стандартов. А я чуть позже назову те, которые взял бы я. (назвал)

И да, я в курсе, что где-то год назад ведьмак создавал тред на схожую тему, но мое знание крестов с тех пор выросло настолько, что меня чуть не взяли работать крестовиком. Так что теперь тред вести буду я. Как обычно, «для себя из прошлого», чтоб гештальты позакрывать.

Итоги по состоянию на 24.12.2021 22:00 (MSK): https://pastebin.com/bxamaGDY

★★★★

Последнее исправление: byko3y (всего исправлений: 6)
Ответ на: комментарий от X512

Не вижу связи. У Windows в ядре Си с исключениями. Бывает и наоборот

Добавления классов с конструкторами-дестукторами требует исключений, потому что иначе нельзя обработать ошибки. А вот обратной причинно-следственной связи нет: наличие исключений не требует классов.

byko3y ★★★★
() автор топика
Ответ на: комментарий от byko3y

потому что иначе нельзя обработать ошибки.

Можно же. Уже написали несколько способов. Всяко лучше, чем голый Си.

Ваши аргументы напоминают анекдот про мужика и японскую бензопилу.

Кстати скажу больше: для классов не обязательны конструкторы и деструкторы, например в Обероне их нет.

X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 1)
Ответ на: комментарий от tiinn

С того, что инкапсуляцию, наследование и полиморфизм не выкинули сразу на мороз, а тащат уже 30 лет. Значит, проверенная временем технология

Кобол. Фортран. Доктора выбирают Marlboro. Сахар-рафинад для похудения — хватит толстеть от яблок. Привлекательная? Да. Полезная? Нет.

byko3y ★★★★
() автор топика
Ответ на: комментарий от X512

Для счётчика ссылок я предлагаю использовать наследование объекта от общего класса счётчика ссылок, вроде IUnknown или BReferenceable. Два счётчика ссылок для одного объекта и отдельный блок в памяти – это перебор и в большинстве случаев не требуется

boost::intrusive_ptr

Выше на буст наезжали, но некоторые его либы попродвинутее стандартной будут.

byko3y ★★★★
() автор топика
Ответ на: комментарий от Legioner

Классы, можно без виртуальных методов и наследования. В целом виртуальные методы тоже иногда пригождаются, но и просто классы это полезно

Узнаю жависта. Классы — один из самых популярных голосов, но, на мой взгляд, самый спорный:

Опрос: Три-пять лучших фич C++ (комментарий)

Зачем классы, если можно без классов? Какую роль классы играют в выполнении алгоритма? (кроме «никакой»)

byko3y ★★★★
() автор топика
Ответ на: комментарий от byko3y

Дуглас Крокфорд

Да епт, нашел джаваскриптера как пример.

Кто-то получает удовольствие от анального секса или регулярных семейных ссор. А я считаю, что ООП в крестах — это пародия на ООП…

А я считаю, что нет. Кто прав?

Я не хотел тебя огорчать, но C++ проиграл. Даже сервисы с требованиями к производительности чаще пишут на Go

Хер с два он проиграл. Ты мне это скажешь, когда рейтинг Go и количество вакансий на нем догонят C++. https://www.tiobe.com/tiobe-index/.

Даже гуглу проще — потому он Go

Да блин, гугл вообще не пример. Он постоянно делает и популяризирует какое-то говно, потому что он типа лучше знает, какие должны применяться технологии. Разве что кроме поисковика своего. Вот взять андроид - тормозящее говно с приложениями на джаве, которые умудряются тормозить и глючить на новых смартах и высаживать батарею за день. Дефолтная звонилка неудобная. Дефолтный календарь тоже. Fit - неудобный и не настраиваемый с мелким шрифтом, который во время бега хер разберешь.

rumgot ★★★★★
()
Ответ на: комментарий от seiken

А кому от этого легче станет, кроме разрабов компиляторов? В плюсах же в основном всё в компайлтайм решается, и если фичу не использовать, кушать она не просит

Просит кушать программист, который ничего не деллает, пока у него полтора часа проект перекомпилируется. Особенно если ты — стартап, который архитектуру приложения переписывает по два раза на день.

byko3y ★★★★
() автор топика
Ответ на: комментарий от xaizek

Просто суть не столько в шаблонах, сколько в типобезопасности, которую они дают за счёт обобщения, а её поддерживают и другие возможности языка. Тогда надо называть типобезопасность, а это уже не мелкое

Вот я, например, могу прожить без RAII, потихоньку утекая ресурсами. Но без хорошей типобезопасности прожить заметно труднее.

byko3y ★★★★
() автор топика
Ответ на: комментарий от byko3y

Зачем классы, если можно без классов? Какую роль классы играют в выполнении алгоритма? (кроме «никакой»)

Код выглядит красивей. Все же пишут на C в стиле

struct myobject *obj = myobject_new(x1, x2);
int z = myobject_somefunc(x, y);
myobject_delete(obj);

Ну и зачем этот онанизм, если есть классы, в которых это записывается нормально и выглядит красиво.

Можно без них. Но лучше с ними.

Legioner ★★★★★
()
Ответ на: комментарий от fsb4000

Всё правильно, С нужен только для устаревшего железо/ПО.

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

Я тоже так могу.

Если нравится С++, то можно использовать С++. Но нужен он только если тебя в детстве покусал Саттер с Майерсом.

goto-vlad
()
Ответ на: комментарий от byko3y

Но вот чудо: нет классов — нет проблем.

Не нужно гнать. Это просто другой подход и парадигма со своими новыми проблемами.

А вот кстати вопрос: строчная - это private, заглавная - public, а protected? Ах да, нет - значит не нужно. Ну конечно.

rumgot ★★★★★
()
Ответ на: комментарий от i-rinat

Например, какой-нибудь сетевой сервис, который для генерации ответа делает несколько запросов к другим сервисам. Сейчас для этого приходится писать код в виде кучи колбеков, а много колбеков тяжело уместить в голове

А разве в 2021 году это не пишется всё поголовно на Go? Запрос к нескольким сервисам... да что там, запрос к ОДНОМУ сервису — это уже довольно высокоуровневая и сложная штука, там нужна не просто асинхронность, там нужно привязывать ресурсы к соединению, останавливать задачи при обрыве соединения, перезапускать таймаутнутые запросы или даже выбирать другой сервер — в общем, даже чудесным CSP эта задача решается только на уровне «херак-херак», и моя основная претензия — корутины решают сложную задачу с сомнительным способом.

byko3y ★★★★
() автор топика
Ответ на: комментарий от rumgot

А вот кстати вопрос: строчная - это private, заглавная - public, а protected?

PrOtEcTeD или pRoTeCtEd, на выбор. Кстати, кто будет писать очередного убийцу C, подхватывайте идею.

goto-vlad
()
Ответ на: комментарий от byko3y

Зачем классы, если можно без классов?

  1. Чтобы диспетчеризовать вызовы виртуальных методов.

  2. RTTI (dynamic_cast).

В Си для того же самого потребуется длинная писанина в которой легко ошибиться.

X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 2)
Ответ на: комментарий от byko3y

который ничего не деллает, пока у него полтора часа проект перекомпилируется.

а это еще доказать надо, что доп. затраты на компиляцию кода с фичей превышают доп. затраты на реализацию ПО без данной фичи

seiken ★★★★★
()
Ответ на: комментарий от byko3y

Что ты мелешь? Какие 1.5 часа? Даже если предположить, что первая компиляция требует 1.5 часа, то нахера каждый раз пересобирать все?

rumgot ★★★★★
()

от трех до пяти фич крестов, которые бы вы взяли с собой на необитаемый остров Си

Ну если не превращать Си в С++, то наверное шаблоны, constexpr, auto, лямбды. Ещё исключения, но с ними непонятно как быть без классов и RAII.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от byko3y

Зачем классы, если можно без классов? Какую роль классы играют в выполнении алгоритма? (кроме «никакой»)

Классы - это парадигма. Ее нужность субъективна, так же как и нужность других парадигм. Но если я например несколько лет разрабатывал с использованием в основном ООП, и умею эффективно решать рабочие задачи с использованием ООП, то нахера мне тратить время на изучение новой парадигмы, если по итогу будет такой же результат, но полученный через другой путь? Или еще вопрос: вот есть Qt, написанный в ООП парадигме. Может им взять и все с нуля переписать без ООП потому что кто-то много умный вдруг решил, что ООП устарел?

Да это все сраная мода - не более. Думаю мудрее поступает тот, кто знает инструмент на высоком уровне, а глупец будет радостный скакать за каждой новомодной фиговиной.

Суть в программировании - алгоритмы, которые можно реализовывать используя любую парадигму.

rumgot ★★★★★
()
Последнее исправление: rumgot (всего исправлений: 1)
Ответ на: комментарий от DarkEld3r

Как тайпдеф тут помогает? Вот пример кода на Go

Речь шла про Си. И да, я ошибся, там тайпдефнуть не получится — только макросом атрибут cleanup докидывать.

byko3y ★★★★
() автор топика
Ответ на: комментарий от X512

От одного заголовочника обычно не зависят все единицы трансляции в проекте. А если зависят, то в нем есть некий публичный интерфейс, который должен меняться крайне редко.

rumgot ★★★★★
()
Ответ на: комментарий от X512

Я вот прямо сейчас пишу драйвер видеокарты Radeon/AMD на C++

Однако, настоящий драйвер Radeon/AMD написан на Си. Потому что никому не хочется радоваться внезапному неявному поведению крестов и непонятно откуда возникающим вспомогательным полям в структурах.

byko3y ★★★★
() автор топика
Ответ на: комментарий от fsb4000

Это С++ везде. nvcc это С++17 компилятор, какой С?

При чем тут nvcc? Он не работает с железом. А компиляторы можно и на хацкеле писать.

byko3y ★★★★
() автор топика
Ответ на: комментарий от byko3y

Потому что никому не хочется радоваться внезапному неявному поведению крестов

В Си всё то же самое неопределённое поведение.

непонятно откуда возникающим вспомогательным полям в структурах.

Это ещё что за бред? Все дополнительные поля документированы в Itanium C++ ABI.

X512 ★★★★★
()
Ответ на: комментарий от X512

потому что иначе нельзя обработать ошибки.

Можно же. Уже написали несколько способов. Всяко лучше, чем голый Си

Тогда я повторю еще раз совет, несколько раз данный мною выше: сначала определите понятие «класс».

byko3y ★★★★
() автор топика
Ответ на: комментарий от rumgot

Кто-то получает удовольствие от анального секса или регулярных семейных ссор. А я считаю, что ООП в крестах — это пародия на ООП…

А я считаю, что нет. Кто прав?

Алан Кей, конечно же. Ну а потом уже и я вместе с ним.

Ты мне это скажешь, когда рейтинг Go и количество вакансий на нем догонят C++

Зарплаты кодеров на Go находятся в топ 3 индустрии. Спрос на них ОГРОМНЫЙ, но предложения, а следовательно и популярности на этих рейтингах, сильно меньше.

Вот взять андроид - тормозящее говно с приложениями на джаве, которые умудряются тормозить и глючить на новых смартах и высаживать батарею за день. Дефолтная звонилка неудобная. Дефолтный календарь тоже. Fit - неудобный и не настраиваемый с мелким шрифтом, который во время бега хер разберешь

Но почему-то им пользуется 80% пользователей смартфонов. Вот так дела.

byko3y ★★★★
() автор топика
Ответ на: комментарий от olelookoe

конечно, не надо постоянно их изобретать из того что есть в наличии + расширять тулчейн своими инструментами для этой же цели. Мешает писать код и решать задачи, потому что вы заняты не задачей, а изобретением того, что уже изобретено, если бы не мешало, вы бы и не занимались этим, но вы занимаетесь, и видимо часто раз с ходу предоставляете эти колхозы и прочие трюки )

abcq ★★
()
Ответ на: комментарий от abcq

и видимо часто раз с ходу предоставляете эти колхозы и прочие трюки

Просто взгляд со стороны: всё-таки больше уважения и доверия к участникам, которые предпочитают предоставить короткий фрагмент кода для повышения степени предметности обсуждения (плюс эти фрагменты кому-то да и будут полезны), вместо того, чтобы бесконечно развозить сопли по клавиатуре в поисках идеального язычка.

goto-vlad
()
Ответ на: комментарий от goto-vlad

а какой вы код то хотите, код реализации немспейсов, перегрузок и так далее в других языках где они уже есть, ну так они все открыты, читайте, никто же не запрещает. Суть не в коде, а в отсутствии функциональности и ее переизобретении каждый раз

abcq ★★
()
Ответ на: комментарий от X512

Чтобы диспетчеризовать вызовы виртуальных методов

Опаньки, у нас откуда-то виртуальные методы выросли. Что там жаваскриптеры скажут про острую необходимость диспетчеризации виртуальных методов? Да куда там — гошники тихо смеются со своей утиной типизацией.

RTTI (dynamic_cast)

Ты точно не спутал с рефлексией? Динамическая типизация (например, сериализаторы) намного лучше работает с полноценной рефлексией, а не с RTTI огрызком. Однако, в JS есть рефлексия, но не нужны классы.

byko3y ★★★★
() автор топика
Ответ на: комментарий от seiken

а это еще доказать надо, что доп. затраты на компиляцию кода с фичей превышают доп. затраты на реализацию ПО без данной фичи

Когда доказывать? У нас превью-релиз вечером!

byko3y ★★★★
() автор топика
Ответ на: комментарий от no-such-file

Ну если не превращать Си в С++, то наверное шаблоны, constexpr, auto, лямбды. Ещё исключения, но с ними непонятно как быть без классов и RAII

Вау. Ты же пыхер, откуда у тебя такие познания в крестах?

byko3y ★★★★
() автор топика
Ответ на: комментарий от byko3y

Алан Кей, конечно же. Ну а потом уже и я вместе с ним.

Авторитет - не аргумент. Может у него уже маразм.

Зарплаты кодеров на Go находятся в топ 3 индустрии. Спрос на них ОГРОМНЫЙ, но предложения, а следовательно и популярности на этих рейтингах, сильно меньше.

Ох. Ну конечно. Похоже на домыслы.

Но почему-то им пользуется 80% пользователей смартфонов. Вот так дела.

Потому что альтернативы нет. Такие дела.

rumgot ★★★★★
()
Ответ на: комментарий от byko3y

Однако, в JS есть рефлексия, но не нужны классы.

В Javascript есть классы и this.

Ты точно не спутал с рефлексией?

Да, точно. Нужно просто определить является ли класс расширением указанного. В Обероне это активно используется для диспетчеризации и обработки сообщений.

	PROCEDURE (v: View) HandlePropMsg (VAR msg: Properties.Message);
		CONST min = 5 * Ports.mm; max = 50 * Ports.mm;
	BEGIN
		WITH msg: Properties.SizePref DO
			IF (msg.w = Views.undefined) OR (msg.h = Views.undefined) THEN
				 msg.w := 20 * Ports.mm; msg.h := 10 * Ports.mm
			ELSE
				Properties.ProportionalConstraint(2, 1, msg.fixedW, msg.fixedH,
										msg.w, msg.h);
				IF msg.h < min THEN msg.h := min; msg.w := 2 * min
				ELSIF msg.h > max THEN msg.h := max; msg.w := 2 * max
				END
			END
		| msg: Properties.ResizePref DO
			msg.horFitToWin := TRUE; msg.verFitToWin := TRUE
		| msg: Properties.FocusPref DO
			msg.setFocus := TRUE
		ELSE	(* ignore other messages *)
		END
	END HandlePropMsg;
X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 1)
Ответ на: комментарий от rumgot

Классы - это парадигма. Ее нужность субъективна, так же как и нужность других парадигм

Классы — это абстрактное непонятно что, на которое навешивается куча разных парадигм. Последняя попытка сделать «классы ради классов» похоронила Sun Microsystems, уже над могилой которого тихонько приколачивают безклассовые расширения на разных парадигмах.

если я например несколько лет разрабатывал с использованием в основном ООП, и умею эффективно решать рабочие задачи с использованием ООП, то нахера мне тратить время на изучение новой парадигмы

Ответ: не эффективно, а тратить время нужно для того, чтобы научиться делать это эффективно. Беда многих военачальников в том, что они думают, будто их приказ «пойти в наступление» выиграл войну. А на самом деле если бы они приказали «отступить», то тоже бы выиграли войну. И если бы ничего не приказывали, а только пьянствовали с путанами, то все равно бы выиграли войну.

Разница проявляется только в жестких пограничных условиях, когда лишнее время компиляции значит, что тебя обогнал конкурент, когда неспособность сменить архитектуру на позднем этапе значит, что твой конкурент в эту нишу зайдет, а ты — нет. Вот возьми Instagram — отвратительная реализация, глубокой финансово уботычный сервис. Но его продали, и разрабы по итогу остались в плюсе, какое бы питонье говно они там не написали. Самое главное — они застолбили эту нишу первыми.

вот есть Qt, написанный в ООП парадигме. Может им взять и все с нуля переписать без ООП потому что кто-то много умный вдруг решил, что ООП устарел?

Я боюсь, что это тема обсуждения целого нового треда. Qt писался на очень старых крестах, еще до STL, он не мог быть другим.

Суть в программировании - алгоритмы, которые можно реализовывать используя любую парадигму

GPGPU как бы говорит, что ты не прав, потому что по скорости выполнения уделывает твой алгоритм на ЦП в 100 раз.

byko3y ★★★★
() автор топика
Ответ на: комментарий от byko3y
  • C нужен для GPGPU

  • nvcc это С++ компилятор

  • При чём тут nvcc?

Зачем нужен C для GPGPU, если самый популярный GPGPU это CUDA, который С++?

fsb4000 ★★★★★
()
Ответ на: комментарий от X512

В Си всё то же самое неопределённое поведение

Неявно != неопределенное. Я согалсен с тем, что некоторое енявное поведение в Си есть, но его сильно меньше.

Это ещё что за бред? Все дополнительные поля документированы в Itanium C++ ABI

Да, документированы. Ты их читал? Это же трешак полнейший, написание кода для прямой работы с памятью превращается в угадайку.

byko3y ★★★★
() автор топика
Ответ на: комментарий от X512

Класс – структура с методами (привязанными к ней функциями)

Ок, тогда лисп первым реализовал классы.

byko3y ★★★★
() автор топика
Ответ на: комментарий от byko3y

Да, документированы. Ты их читал?

Я даже писал код на другом языке (Оберон), бинарно совместимый с динамическими библиотеками на C++ и напрямую взаимодействующий с их ABI.

Признайтесь уже, что как работает C++ вы не знаете.

X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 1)
Ответ на: комментарий от rumgot

Авторитет - не аргумент. Может у него уже маразм

Может. Но тогда получается, что у всей индустрии маразм — что есть весьма близко к реальности, потому что как еще объяснить такую страсть к подражанию ООП Алана.

Зарплаты кодеров на Go находятся в топ 3 индустрии. Спрос на них ОГРОМНЫЙ, но предложения, а следовательно и популярности на этих рейтингах, сильно меньше.

Ох. Ну конечно. Похоже на домыслы

Какие еще факты тебе нужны?

Потому что альтернативы нет. Такие дела

«Уже нет» — поправил. Я сам Maemo пользовался.

byko3y ★★★★
() автор топика
Ответ на: комментарий от byko3y

Ты же пыхер

ЛОЛ, с чего ты взял? Я просто поясняю макакам, что пых отличный инструмент, лучший в своём классе. Я работал на крестах, и вообще начинал с Си/С++ потому что в те времена не было никаких пыхов.

no-such-file ★★★★★
()
Ответ на: комментарий от X512

Однако, в JS есть рефлексия, но не нужны классы.

В Javascript есть классы и this

Еще раз: «есть, но не нужны». А вообще-то нет, там от классов только ключевое слово «class».

byko3y ★★★★
() автор топика
Ответ на: комментарий от byko3y

У вас под классами понимаются какие-то непонятные фантазии. Классы в Javascript есть. Прототипное ООП и всё такое. Синтаксис вполне типичный для классов object.method(args);.

X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 1)
Ответ на: комментарий от fsb4000

Зачем нужен C для GPGPU, если самый популярный GPGPU это CUDA, который С++?

CUDA — это костыль, который прокатывает просто потому, что абсолютно любая реализация алгоритма числодробилки на фортране для ЦП проигрывает GPGPU даже с огромными накладными расходами на общение с видеокартой. Даже питон быстрее фортрана бывает порой. Интелю пора сматывать удочки, он слишком засиделся.

byko3y ★★★★
() автор топика
Ответ на: комментарий от X512

Я даже писал код на другом языке (Оберон), бинарно совместимый с динамическими библиотеками на C++ и напрямую взаимодействующий с их ABI.
Признайтесь уже, что как работает C++ вы не знаете

М'сье знатный содомит, моё почтение.

byko3y ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.