LINUX.ORG.RU

Ушат помоев в сторону крестолюбов

 , , ловите наркомана,


15

14

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

Последние 7 лет я пишу сугубо на C, и только под Linux (да, да -std=gnu99 и accept4, dup3, __attribute__((cleanup(dtor))) и прочие приятности, позволяющие сделать волосы шелковистее на 15.5%) и не понимаю, для чего вообще нужен C++? То, что на сишке делается красиво и элегантно, в крестах напоминает соитие парализованных дцпшников (к сожалению, утерял картинку, но именно этот образ всплывает в голове, когда вижу очередную порцию крестолапши).

Давайте посмотрим на типичного C++ разработчика: он использует STL, boost, многие любят Qt (не только для GUI), якобы чтобы «писать кроссплатформенный код». В итоге болезный не знает током ни WinAPI, ни POSIX — ничерта. Он абсолютно не разбирается, как работает целевая система, для которой пишет код! Крестокодер просто не осознает, какой лютый ужас кроется за его любимыми iostream-ами, какое лютое говно лежит в boost::filesystem::path, насколько убого-низкоуровневым является boost::asio в 2016 году.

Только крестораб может эпично обосраться и просадить производительность, забыв передавать по ссылке параметры для «горячих» функций (то есть, просто забыв написать «&» в нужном месте).

Также эти убогие завистливо смотрят на type inference в языках, проектировавшихся не как «C на стероидах», и в ответ начинают лепить template и auto не к месту, от чего код адово пухнет и даже IDE перестает его понимать.

Серьезно, просто прекратите писать на этом языке. В следующий раз, начиная новый проект, выберите java (щютка)/go/swift/rust/c. Прекратите насиловать труп и отравлять зловонием все вокруг!

Перемещено true_admin из talks

★★★★

Последнее исправление: a1batross (всего исправлений: 2)

Ответ на: комментарий от Dudraug

Я не говорю, что код хороший, но приводить его в пример ужасного С++ не стоило.

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

в деструкторе
ну ок
на этом беседу с необучаемым можно заканчивать

Слив засчитан :-) Впрочем, не было сомнений, что адепт не слышал про явный вызов деструктора, поэтому так слажался :-) Квалификация адептов цепепе - штука неоднозначная :-) Лол :-)

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

я смотрю, тебе нравится жрать говно...

адепт слышал, что за ub компилятор может сгенерировать код, который потрёт весь прон в твоём хомяке.

anonymous
()
Ответ на: комментарий от RazrFalcon

Они, в отличии от, типобезопасны

Привет, я типобезопасный printf: -Werror=format

Я хренею с крестолицемерия: то они кудахчут про типобезопасность и ко-ко-ко, то на каждом шагу лепят auto и template typename T потому что ваще не врубаются, что за типы тут получатся.

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

я смотрю, тебе нравится жрать говно...

Посмотри лучше в зеркало :-)

адепт слышал, что за ub компилятор может сгенерировать код, который потрёт весь прон в твоём хомяке.

Ого! :-) Бедный адепт :-) Смотри, не пиши так в деструкторах! :-)

Можешь написать письмо команде GCC, узнать, почему у них в деструкторе nullptr по факту присваивается :-) Ну а пока поржите всем стартапом :-)

~unique_ptr() noexcept
{
  auto& __ptr = std::get<0>(_M_t);
  if (__ptr != nullptr)
    get_deleter()(__ptr);
    __ptr = pointer();
  }
anonymous
()
Ответ на: комментарий от kawaii_neko

Какая связь между типобезопасными потоками ввода-вывода и auto? Учите матчасть.

RazrFalcon ★★★★★
()

Кстати, еще немножечко крестотипобезопасности:

std::atomic<unsigned int> count;

std::atomic_fetch_add(&count, 1);
/*
error: no matching function for call to ‘atomic_fetch_add(std::atomic<unsigned int>*, int)’
     std::atomic_fetch_add(&count, 1);
*/
Подтекающие абстракции во всей красе. А вот старый добрый
unsigned int count;
__sync_fetch_and_add(&count, 1);
Себя отлично чувствует. Более того, он и к long-u «1» спокойно прибавит, а вот крестоатомики потребуют явного «1l».

Сейчас, конечно же, налетят одепты с криками: «Куд-кудах, все правильно, ко-ко-ко, комитет не обсирается!» — что еще можно ожидать от поехавших крестофоннатов.

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

то на каждом шагу лепят auto и template typename T потому что ваще не врубаются, что за типы тут получатся.

Вам еще никто не объяснил, что эти самые auto и template typename и есть одни из инструментов обеспечения типобезопасности?

Давно ли вы писали int l = strlen(s); в последний раз?

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

мало ли на свете быдлокодеров? в стандарте [unique.ptr.single.dtor] написано так:

Effects: If get() == nullptr there are no effects. Otherwise get_deleter()(get()).
налепили отсебятины — не соответствуют стандарту.

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

в стандарте [unique.ptr.single.dtor] написано так:
налепили отсебятины — не соответствуют стандарту.

«Куд-кудах, все правильно, ко-ко-ко, комитет не обсирается!» (C) :-)

Самомнение, однако :-)

anonymous
()
Ответ на: комментарий от eao197

Горазды вы дно пробивать. А слабо еще что-нибудь такое-эдакое выдать?

Кукарекать все горазды, а как правильно делать-то?

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

Кукарекать все горазды, а как правильно делать-то?

Прочитать сообщение об ошибке компилятора?

Hint: std::atomic_fetch_add(&count, 1u);

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

auto и template - типобезопасны. Зачем забивать себе голову, если за типобезопасность отвечает компилятор и бьет по рукам.

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

Hint

Нда, как-то у тебя со зрением плохо.

kawaii_neko: а вот крестоатомики потребуют явного «1l».

Умом я понимаю, что к

template<typename T> T atomic_fetch_add(std::atomic<T> &v, T a)
не совсем корректно применять integer types propagation, но тем же самым умом я понимаю, что std::atomic в такой реализации — конченный идиотизм.

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

auto и template - типобезопасны. Зачем забивать себе голову, если за типобезопасность отвечает компилятор и бьет по рукам.

Потому что в крестах убогий вывод типов. См про std::atomic.

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

auto и template - типобезопасны.

Лол :-) Особенно когда

vector<int> v(10'000'000'000);
for (auto i = 0; i < v.size(); ++i) {
  v[i] = i;
};
:-)

anonymous
()
Ответ на: комментарий от kawaii_neko

Нда, как-то у тебя со зрением плохо.

В упор не увидел в вашем примере с std::atomic<uinsigned int> использование константы 1u. Константа 1l имеет другой тип.

Умом я понимаю

Чем-чем, простите?

но тем же самым умом я понимаю, что std::atomic в такой реализации — конченный идиотизм.

Как по мне, так это отличная защита от идиотов, которые не обращают внимания на предупреждения о смешении unsigned и signed значений в выражениях.

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

Как по мне, так это отличная защита от идиотов, которые не обращают внимания на предупреждения о смешении unsigned и signed значений в выражениях.

Это какой-то ocaml-style, противоречащий всему остальному языку. Сам-то, поди всегда знаковый int пишешь, потому что короче и меньше думать надо?

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

Сам-то, поди всегда знаковый int пишешь, потому что короче и меньше думать надо?

Не угадали.

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

Ссылка - это указатель

Пруф.

anonymous
()
Ответ на: комментарий от kawaii_neko

не совсем корректно применять integer types propagation

какой в сад integer types propagation, если у тебя в определении стоит

atomic<T> &v
а ты суешь указатель
atomic<T> *v
Вот именно та самая типобезопаснасть дала тебе прямо в зуб за попытку впихнуть невпихуемое.

А если б это была твоя сишка в похожей ситуации, ты бы уже крэши с дебагером ловил в поте лица.

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

Нет, atomic_fetch_add() на самом деле от указателя.

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

Ты передаешь указатель на count в функцию, которая указатель не принимает. Явная ошибка.
какой в сад integer types propagation, если у тебя в определении стоит atomic<T> &v

Уносите этого плюсоинвалида: http://en.cppreference.com/w/cpp/atomic/atomic_fetch_add

Лоровские пятизвездочные прафисианалы во всей красе.

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

так продолжайте оставаться в жопе, мне то что?

Не-не, расскажите лучше еще в красках про бедственное положение российской науки. Больше боли, больше подробностей!

Вы же физмат какой то в НГУ закончили и уехали в счастливое зарубежье? Скажете скорее куда? Какая у Вас позиция? Зарплата? Какие задачи решаете? Поделитесь историей успеха?

Или Вы используете свой совершенны английский только для крика «свободная касса»?

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

Ты сам написал там ссылку выше.

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

O(const), что для удобства принято обозначать как O(1)

пздц.

anonymous
()
Ответ на: комментарий от AIv

Где в скалярном волновом уравнении векторное произведение?;-)

У вас было про 3Д область 1000**3. Вект.произв. просто для простейшего примера, что 20 тактов на ячейку - странно. Интересно посмотреть на ваш код.

Ну и не 20 а вроде бы шесть без avx

Без avx - по 3 мат.операций на компоненту, 3 пересылки регистр-регистр и 6+3 пересылок в регистр+обратно (3*3+3+9=21 асм строчка). С avx2 - 3 операции, 3 пересылки и ~2 перемешки (8 асм строк, но они не по такту).

можно считать на флотах.

Всегда можно? :)

anonymous
()
Ответ на: комментарий от eao197

Функция на 4 строчки с одним if-ом стала нетривиальной?

Любая ф-я с глобальной переменной нетривиальна. Код становится значительно менее читабален.

Логика, кстати, зависит от тех же самых переменных, что и исходный метод с копипащенными switch-ами. И это не глобальные переменные, это атрибуты класса.

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

anonymous
()
Ответ на: комментарий от eao197

«Копипаста», «сэкономишь на сопровождении». Можно примеры подобного сочетания?

Да в любом номральном софте. Копипаста _сама по себе_ ни чем не вредна. А вот попытки ее избежать - часто вредны.

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

Копипаста _сама по себе_ ни чем не вредна

Глубокая философия.

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

Они глобальные по отношении к функции, то есть не важно.

Да, блин, настало время акуительных открытий. Было:

struct TextSource {
	obs_source_t *source = nullptr;
...
	bool vertical = false;
...
	void GetStringFormat(StringFormat &format);
...
};
void TextSource::GetStringFormat(StringFormat &format)
{
	UINT flags = StringFormatFlagsNoFitBlackBox |
		StringFormatFlagsMeasureTrailingSpaces;

	if (vertical)
		flags |= StringFormatFlagsDirectionVertical |
			StringFormatFlagsDirectionRightToLeft;

	format.SetFormatFlags(flags);
	format.SetTrimming(StringTrimmingWord);

	switch (align) {
	case Align::Left:
		if (vertical)
			format.SetLineAlignment(StringAlignmentFar);
		else
			format.SetAlignment(StringAlignmentNear);
		break;
...

Могло бы стать:

void TextSource::GetStringFormat(StringFormat &format)
{
	UINT flags = StringFormatFlagsNoFitBlackBox |
		StringFormatFlagsMeasureTrailingSpaces;

	if (vertical)
		flags |= StringFormatFlagsDirectionVertical |
			StringFormatFlagsDirectionRightToLeft;

	format.SetFormatFlags(flags);
	format.SetTrimming(StringTrimmingWord);

	const auto handle_halign = [&](auto vert, auto horz) {
		if (vertical)
			format.SetLineAlignment(vert);
		else
			format.SetAlignment(horz);
	};
	switch (align) {
	case Align::Left:
		handle_halign(StringAlignmentFar, StringAlignmentNear);
		break;
...

Какие глобальные переменные? Хватит бредить и нести херню.

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

Копипаста _сама по себе_ ни чем не вредна.

Да, не видели вы копипасты. Не приходилось вам код с копипастой суппортить...

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

Уверен, что и ты, и оп, и авторы того недавно всплывавшего gstreamer плагина себя криворукими тоже не считаете.

идеальных программистов не бывает, т.к. они тоже люди

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

Раст в принципе безопасен. Если уязвимость найдена в сишном коде — виноват язык. Если в расте — исключительно сам программист.

тооооочно. Если кухонным ножом зарезали человека - виноват нож.

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

Если кухонным ножом зарезали человека - виноват нож.

... если электрической бритвой — однозначно человек :)

anonymous
()
Ответ на: комментарий от reprimand

не буду говорить за других, но лично я стараюсь быть НЕ криворуким

И при этом ты настолько уверен в том, что у тебя получается, что отказываешься от помощи инструментов. Но статистика упрямая вещь - у тебя _не получается_. ТА если так - твои старания стоят недорого.

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

но лично я стараюсь быть НЕ криворуким

Вы сами определяете объективную оценку? Отлично.

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

if (true) MACRO1(a, b) else MACRO1(b, a);

Найс у тебя консистентность

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

Ты как-то очень хорошо думаешь о синьорах.

это не про сеньоров, точнее не про C++, мусью расписал механизм ротации java-monkey на Ъ-ынтерпрайз-проектах ))

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