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)
Ответ на: комментарий от anonymous

несопровождабельная кашка из скобачек бывает отдельно запрещена статик-коде-анализаторами в CI цепочке.

А вот и боязнь скобочек :-) object.f( object.g( object.h() ) ) — с dot-нотацией и специально с пробелами внутри скобочек :-) Так лучше? :-) Лол :-)

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

Но данная имплементация имеет два больший недостаток (или один, ибо эти два связанны)

1) не имеет средств борьбы с возрастающим числом коллизий.

2) Размер таблицы надо знать заранее

Ну еще можно и третье выделить - содержит больше кода.

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

object.f().g().h()

Можно и так :-) Но кто сказал, что так лучше? :-) Ты? :-) Или ООП «гуру»? :-) А ты про unified call syntax, который хотели внести в цепепе-17, но не осилили, слышал? :-)

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

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

#include <iostream>
#include <boost/filesystem.hpp>

int main(int argc, char **argv)
{
    namespace fs = boost::filesystem;
    fs::path p("/etc/fstab");
    if (fs::is_regular_file(p))
        std::cout << fs::file_size(p) << std::endl;
    return 0;
}

Запускаем:

$ strace -estat ./a.out
stat("/etc/fstab", {st_mode=S_IFREG|0664, st_size=757, ...}) = 0
stat("/etc/fstab", {st_mode=S_IFREG|0664, st_size=757, ...}) = 0
757
+++ exited with 0 +++
Браво, мы написали иффиктивный кроссплатформенный код, какие молодцы! Ты, конечно, можешь вскукарекнуть про file_status, только дело в том, что из file_status не получить размер файла. Типичная продуманная крестобиблиотека для написания кроссплатформенной блоатвари.

В итоге & ставится на автомате для всех структур и классов (кроме умных указателей).

А самое главное, если рука где-нибудь дрогнет и привычно нарисует shared_ptr<T> &ptr, и может очень неловко получиться.

И да, в Си ссылок нет, поэтому там структуры передают по указателю

Ссылка — это урезанный указатель для неосиляторов. Кстати, в C можно передавать структуры по значению, вот только зачем?

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

Пользователям ПО насрать, какой там у тебя код. auto и неуемное использование template приводит к распуханию бинарника.

kawaii_neko ★★★★
() автор топика

многие любят Qt (не только для GUI), якобы чтобы «писать кроссплатформенный код». В итоге болезный не знает током ни WinAPI, ни POSIX — ничерта

Какому-то софту хватает и такой абстракции чтобы хорошо работать.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от Dudraug

Ну вообще такой код - это та еще стыдобень.

Докажи :-) Или ты балабол? :-)

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

Ссылка — это урезанный указатель для неосиляторов.

Но ссылка - это не указатель. Ваши познания в С++ поражают.

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

Это не боязнь скобочек, а лень читать твои закорючки (у талантов — выходящие за правый край окна), хоть с дот нотацией, хоть без, когда можно не читать (а выхлоп одинаковый) — но коде-ревью никто не отменял. А «умничающих» пионеров сильно много, которые еще никак себя не проявили и уважения к правилам, которые не зафорсены не обнаруживают даже после персональной просьбы (в идеале лучше бы их прошить в железе, но хватит и робота в апстриме). Ты либо следуешь правилам и не бесишь людей специально отступлениями от (это могут быть гайдлайны заказчика — тупо проверка на адекват, молчек: что изменения в коде предсказуемые, парень не дурак и понял :)) — либо с тобой прощаемся «удачи в само-найминге» :)

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

Но ссылка - это не указатель. Ваши познания в С++ поражают.

Твои тоже :-) Ссылка - это указатель, только разыменованный :-) Но указатель :-) Иначе виртуальные функции через ссылки было бы вызывать нельзя :-) Лол :-)

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

Ссылка — это урезаный по самое небалуйся указатель, чтобы у крестодетей не случился разрыв шаблона. Лично я считаю, что за ссылки надо отхлестать весь крестовый коммитет ссаными тряпками на базарной площади.

{
  std::string str = "hello", wrld = "world";
  std::string &rstr = str;  // so awesome
  std::cout << rstr << std::endl;
  rstr = wrld;              // references are so fucked
  std::cout << str << ", " << rstr << std::endl;
}
{
  std::string str = "hello", wrld = "world";
  std::string *pstr = &str;
  std::cout << *pstr << std::endl;
  pstr = &wrld;   // pointers are so consistent, explicit and awesome!
  std::cout << str << ", " << *pstr << std::endl;
}

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

а лень читать твои закорючки
(а выхлоп одинаковый)

Спалился, можешь залогиниться :-)

Ты либо следуешь правилам и не бесишь людей специально отступлениями

Либо сам придумываю правила :-)

либо с тобой прощаемся «удачи в само-найминге»

Это же лучше, чем тапком от тимлида великого и нужного всем проекта на цепепе? :-) Лол :-)

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

местные неадекваты от C, похоже, даже не понимают чего от них хотели: сортируют неупорядоченные контейнеры, тащат berkeley db...

Люблю такое.

Вы чего хотели? Аналога на С? Ну вот, написали уже четыре штуки в треде. Я даже написал более интересный вариант - с возможностью держать этот хеш на диске. Не любо? Надо чтоб как на С++, а вот если нет, то фигня какая-то. Подсказываю - можно чморить варианты на С количеством строк (главное при этом не писать сколько SLOC в STL).

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

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

Размер таблицы надо знать заранее

Об этом я сразу сказал. Но что-то мне подсказывает, что если число элементов большое, тыщ 500, то в случае С++, время на insert будет расти экспоненциально, и состаришься ждать. Чудес не бывает.

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

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

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

Писали бы в монгу, например, а что?

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

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

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

если число элементов большое, тыщ 500, то в случае С++, время на insert будет расти экспоненциально, и состаришься ждать. Чудес не бывает.

Ты, похоже, путаешь хэш-таблицу с упорядоченным контейнером. http://supercomputingblog.com/windows/ordered-map-vs-unordered-map-a-performa...

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

написали уже четыре штуки в треде
Я даже написал более интересный вариант

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

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

Ну вот, написали уже четыре штуки в треде
Надо чтоб как на С++

Ну ты же кривишь душой. Понятно же, что на Rust, Go, Java, Swift и пр. и пр. есть один стандартный простой и компактный вариант, и эти варианты без проблем бы приняли, а на C такового нет, вот и рождаются каждый раз велосипеды разной кривости. И можно было бы говорить, что С такой уж оптимизированный, что ему не надо универсальных решений и все такое, но ведь эти велосипеды не отличаются эффективностью, и даже сишный же glib их зарулит.

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

неадекваты
адекватным
адекватному

А-а

Писали бы в монгу, например, а что?

Нет-нет, все хорошо, очень консистентно

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

В своё время мне довелось писать игры на плюсах. Постоянно ловил себя на том, что на каком-нибудь ОКамле писалось бы гораздо проще и веселее.

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

Ссылка даёт больше гарантий

Никаких гарантий по сравнению с указателями ссылки не дают :-) Они даже опаснее, чем указатели :-)

struct T{};

// нормально, скомпилируется
T
f() {
  T object;
  return object;
}

// неопределённое поведение, но скомпилируется
T&
f() {
  T object;
  return object;
}

// нескомпилируется
T*
f() {
  T object;
  return object;
}
anonymous
()
Ответ на: комментарий от anonymous

// неопределённое поведение, но скомпилируется

Только у тех, кто забивает на предупреждения компилятора.

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

Ссылка даёт больше гарантий и проще для оптимизаций компилятором

Ссылка дает меньше свободы для маневра, чтобы не перенапрячь и без того слаборазвитые крестоизвилины. Мистические «оптимизации конпелятора» — это классическая мантра крестобыдла, которые не работают.

И да, коль скоро речь зашла об оптмизации, в крестах близко нет ничего похожего на restrict из C99.

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

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

Так языки же разные? Какой именно аналог требовался, непонятно. То есть понятно, что требовался адекватный аналог, но это как-то слишком расплывчато.

Нужен был похожий (или даже одинаковый) исходный код, символ в символ? Одинаковый алгоритм хеширования? Одинаковое расположение в памяти? Аналогичная скорость вывода результата?

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

Ты, похоже, путаешь хэш-таблицу с упорядоченным контейнером

Тебя несколько раз прямо спросили, что у unordered_map под капотом. Ты стыдливо молчишь, как двоечник, которого поймали на невыполненной домашке и пытаешься всучить завучу какие-то зачуханные бенчмарки. Типичный розроботчег на C++.

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

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

Вы бы хоть вики почтили. Хотя чего еще от вас ждать.

но скомпилируется

С варнингом.

нескомпилируется

Ясен пень не скомпилируется. У вас типы не совпадают.

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

Если вам не важна производительность

Как раз у окамла с производительностью вполне хорошо. А выразительные средства — на порядок лучше.

Я ж не предлагаю на Хаскеле писать. На нём пусть фейсбук пилят.

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

Только у тех, кто забивает на предупреждения компилятора.

У всех :-) Предупреждение - не ошибка :-)

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

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

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

Крестоолухи, не ожидавшие, что на C можно делать хеш-таблицы, изрядно опешили и начали что-то мямлить про «полные аналоги». 2016-й год уже, кругом цифра, а крестолалки все еще возятся со своими «аналогами».

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

И? От этого они становятся идентичным?

Нет, но изоморфыми. Любые гарантии, которые могут дать ссылки, указатели могут дать тоже.

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

меньше свободы для маневра

И меньше шансов выстрелить себе в ногу. Но кого это волнует.

которые не работают

Пруфы, как обычно, потеряли?

перенапрячь

Жизнь слишком коротка, чтобы постоянно думать о забытых free.

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

Вы бы хоть вики почтили. Хотя чего еще от вас ждать.

А о тебя? :-) Гарантии висячих ссылок? :-) Лол :-)

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

Как раз у окамла с производительностью вполне хорошо.

То-то на нём все игры и пишут. Сколько там игр на окалмле - 0?

А выразительные средства — на порядок лучше.

Этот тут вообще при чём?

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

С варнингом.

Но скомпилируется :-)

Ясен пень не скомпилируется. У вас типы не совпадают.

Поэтому ссылки дают меньше гарантий и больше возможностей ошибиться :-)

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

Но скомпилируется

-Werror

Поэтому ссылки дают меньше гарантий

Непонимание работы стека причина данной ошибки. Указатель там или ссылка - роли не играет.

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

Непонимание работы стека причина данной ошибки. Указатель там или ссылка - роли не играет.

Какое нахрен непонимание работы стека? :-) Причина данной ошибки часто в банальной невнимательности программиста, который случайно добавил & к типу возвращаемого значения :-)

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

Три элемента помещаются в контейнер, затем его содержимое распечатывается.

Описание уровня: программа работает. Понятие «алгоритм» вам знакомо?

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

невнимательности

Программист случайно написал функцию, которая возвращает ссылку.

Программист случайно вернул локальный объект.

Программист случайно пропустил варниг компилятора.

Программист случайно не запустил тесты.

Программист случайно не заметил, что прога упала.

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

У вас есть сорцы фотошопа? Я бы посмотрел. Исходя из публичной информации, на C# там только часть GUI.

а кроме игр?

Многомиллиардная индустрия уже не интересует?

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

Конечно нет :-) Просто программист написал программу, которая делает что-то более-менее полезное, и не сделал ни одной ошибки :-) А если бы и сделал, то выявил бы ошибку либо компилятором, либо тестами, либо увидел бы, что прога упала ещё перед тем, как зарелизил :-) Лол :-)

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

Пруфы, как обычно, потеряли?

okay, давай начнем с того, что крестодети свято веруют в std::copy. Ну что же, давайте макнем их головой в говно:

#include <algorithm>
#include <string.h>

int main(int argc, char **argv)
{
    unsigned len = strlen(argv[0]);
    char *d = new char[len + 1];
    std::copy(argv[0], argv[0] + len + 1, d);
    return strlen(d);
}
А теперь следи за руками:
g++ -O2 3.cpp -S -o /dev/stdout | c++filt
	.file	"copy.cpp"
	.section	.text.unlikely,"ax",@progbits
.LCOLDB0:
	.section	.text.startup,"ax",@progbits
.LHOTB0:
	.p2align 4,,15
	.globl	main
	.type	main, @function
main:
.LFB480:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	pushq	%rbx
	.cfi_def_cfa_offset 24
	.cfi_offset 3, -24
	movq	%rsi, %rbp
	subq	$8, %rsp
	.cfi_def_cfa_offset 32
	movq	(%rsi), %rdi
	call	strlen
	leal	1(%rax), %edi
	movq	%rax, %rbx
	call	operator new[](unsigned long)
	movq	0(%rbp), %rsi
	movl	%ebx, %edx
	movq	%rax, %rdi
	addq	$1, %rdx
	call	memmove           // ну да, так оптимально, что я теряю дар речи
	movq	%rax, %rdi
	call	strlen
	addq	$8, %rsp
	.cfi_def_cfa_offset 24
	popq	%rbx
	.cfi_def_cfa_offset 16
	popq	%rbp
	.cfi_def_cfa_offset 8
	ret
	.cfi_endproc
.LFE480:
	.size	main, .-main
	.section	.text.unlikely
.LCOLDE0:
	.section	.text.startup
.LHOTE0:
	.section	.note.GNU-stack,"",@progbits
gcc и icc используют memmove, clang - memcpy (самый умный конпелятор, кстати, в общем случае также использует memmmove). В итоге «кроссплатформенный крестолапшеговнокод» будет подтормаживать. Зато мы гордо используем std::copy — он ведь такой оптимааальный, что просто вау!

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