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)

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

крестодети свято веруют в std::copy

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

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

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

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

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

В отличие от крестолалок в этом треде, я даже указал некоторые ключевые характеристики uthash. unordered_map остается загадочной «неупорядоченной картой» (черт, как вспомню, так проигрываю).

Также ни один кресторебенок не смог выдавить, что не так. Оно и понятно — трудно придумать что-то и не обосраться, когда не понимаешь, что тут вообще происходит.

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

То-то на нём все игры и пишут.

По кругу решил пойти?

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

При том, почему СТОИТ на нём писать.

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

Ну что же, давайте макнем их головой в говно:

call memmove // ну да, так оптимально, что я теряю дар речи

(участливо) Расскажи, что тебя так поразило.

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

int * const?

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

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

Ну это же не я слился.

Может, всё-таки аргументами будем кидаться, а не какашками?

Ещё раз, если не помнишь: я говорю о том, на чём СТОИТ писать, а не о том, на чём ПИШУТ.

Miguel ★★★★★
()
Ответ на: комментарий от kawaii_neko
#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);
}

Это не по гайдлайнам от гуру и не по ООП :-) Вот как надо же:

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

int main(int argc, char **argv)
{
    std::string argv0 = argv[0];
    std::copy(argv0.begin(), argv0.end(), argv0.begin());
    return argv0.size();
}

:-)

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

указал некоторые ключевые характеристики uthash

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

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

Что ты в меня стоковыми examples тычешь? Пошел и написал полный аналог©! Великодушно напоминаю: в исходном примере значение хранило в себе int и string, а поиск возможен как по строковому ключу, так и по int внутри value.

Ну а если ты все-таки осилишь, потом мы посчитаем malloc-и и еще раз повеселимся с крестодетей. emplace-то в бустовую хрень поди забыли завести?

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

memmove
В итоге «кроссплатформенный крестолапшеговнокод» будет подтормаживат

LOL, человек пихающий в код strlen и strcpy рассказывает про тормоза от memmove.

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

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

[user@ ~]$ clang++-3.7 --std=c++14 umap.cpp 
[user@ ~]$ ./a.out 
268435455 is max size
[user@ ~]$ cat umap.cpp 
#include <iostream>
#include <string>
#include <unordered_map>

int main() 
{   
  std::unordered_map<std::string, std::string> mp;
  size_t m = mp.max_bucket_count();
  std::cout << m << std::string(" is max size") << std::endl;
  return 0;
}

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

(участливо) Расскажи, что тебя так поразило.

Засунь в tight loop memmove вместо memcpy да посмотри. Как говорится, лучше один раз увидеть.

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

Напоминаю:

хорошей ниши для плюсов нет.

Я привёл вам несколько ниш. Вы же начали рассказывать про какое-то удобство и прочую муть.

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

давай не адоб возьмем а косперсоко, на конференции(3 масяца назад была) по хаскел они открыто заявили что они переводят свой продукт на хаскел) а точнее они используют хаскел для кодогенерации сишных сырцов. на тот момент это было 15% исходников антивируса

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

И оба поиска O(1)? И без лишнего выделения памяти? Мне твою портянку читать лень если честно. И в реальном проекте, если это не прошивка роутера или смарт-карты, жертвуют перформансои и/или памятью ради читаемости кода. А оптимизируют только когда получают проблемы. Ты же понимаешь, если дрочиться и стараться всегда написать код который ничего не жрет и работает как молния, то это ж можно ни в какие сроки не уложиться.

И мне такую простыню видеть неприятно. Еще раз у тебя есть структура данных {int; string;} и ты хочешь в коллекции таких объектов искать по обоим полям с O(1), ну или хотя бы O(log n). Я прав?

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

и не сделал ни одной ошибки :-)

Потом устал и сдела :) Не делают ошибок роботы. А в тестах тоже ошибки бывают и будут пока их пишут люди, если тестов больше пары десятков — а еще их приходится переписывать, если код не настолько протух, что на него всем похер :)

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

Да не. Оч может быть. Касперские те еще наркоманы. Правда говном их антивирус стать от этого не перестанет.

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

Я привёл вам несколько ниш.

Я сказал «хорошей».

Вы же начали рассказывать про какое-то удобство и прочую муть.

Эм... вообще-то, если для какой-то цели язык неудобен, это значит, что это не его ниша.

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

Какой объем данных копировать?

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

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

в tight loop memmove вместо memcpy да посмотри. Как говорится, лучше один раз увидеть.

#include <string.h>

#define N (1024*1024)

void main()
{
	void *p1 = calloc(1, N), *p2 = calloc(1, N);
	int i;

	for (i = 0; i < 20000; i++)
		memmove(p1, p2, N);
}
$ gcc -O2 a.c && time ./a.out

real	0m1.312s
user	0m1.308s
sys	0m0.000s

Меняем memmove на memcpy и получаем

$ gcc -O2 a.c && time ./a.out

real	0m1.298s
user	0m1.296s
sys	0m0.000s

И?

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

И оба поиска O(1)? И без лишнего выделения памяти?

Да.

Еще раз у тебя есть структура данных {int; string;} и ты хочешь в коллекции таких объектов искать по обоим полям с O(1), ну или хотя бы O(log n). Я прав?

Не у меня, а у asaw. И не (int, string), а (string1, int, string2), хочется поиск по string1 и int (само собой, пусть оба будут уникальны). И поиск таки O(1). И чтоб без лишних дублирований структур.

Мне твою портянку читать лень если честно

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

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

В итоге «кроссплатформенный крестолапшеговнокод» будет подтормаживать.

Ой-вей... Где это критично, есть такое слово «профайлер» (если, конечно, твои религиозные убеждения не запрещают именно std::copy... И замену его на чего душа пожелает :))). Где не критично — всем накласть (либо используется zero-copy с пропуском нахуй даже TCP/IP стека, милого сердцу защитникам сишки (тоже выбрали какое говно, носятся с ним как с апофигеем «производительности», забивая на сопровождабельность и надежность), и ни std::copy, ни твои «писаные торбы» в качестве замен и не ночевали, а все прошито в ASIC или юзается свой стек «СБиШ» и «широкополосными» карточками за овердохуя денег :))  — а так, всем похуй на детали реализации, особенно пока не надо менять ни строчки кода, для переноса с системы на систему, если это не рокет-саенс с «МИШОН КРИТИКАЛ»(ТМ), где Сишку слава богу есть чем заменить, чем ебаться с этой экономией на спичках, или какой-нибудь, ни боже мой, сраный «HFT» со сраными торговыми роботами, в котором уже многие кодят на жабке с дотнетом и не парятся (потому что результат надо щас, а не через два года — и по хорошему пора ему накрыться медной пиздой вместе с фондовыми рынками фор да греат джастис :)

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

Зрение норм еще? Это пройдет :)

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

первый — на паскале. адоб год-полтора назад выложил

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

так как RazrFalcon немогет, давай я попробую. Цпп применим в приложениях достаточно обьемных по коду и требующих низкой latency в условиях только вертикального масштабирования. Таких направлений знаю два - игры и hft.

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

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

Программист случайно всю систему

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

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

И?
time ./a.out

Просто убил меня.

Правда результат правильного бенчмарка убил еще больше. Ну ок, теперь тоже всегда буду использовать memmove.

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <string.h>

int main(int argc, char **argv)
{
    char *a, *b;
    int len, count, i;
    unsigned long ns;
    struct timespec ts[2];
    const char *fn;

    len = atoi(argv[2]);
    count = atoi(argv[3]);
    a = malloc(len); b = malloc(len);
    memset(a, 0, len); memset(b, 0, len);

    if (argv[1][0] == 'c') {
        clock_gettime(CLOCK_MONOTONIC, ts);
        for (i = 0; i < count; i++)
            memcpy(a, b, len);
        clock_gettime(CLOCK_MONOTONIC, ts + 1);
        fn = "memcpy";
    } else {
        clock_gettime(CLOCK_MONOTONIC, ts);
        for (i = 0; i < count; i++)
            memmove(a, b, len);
        clock_gettime(CLOCK_MONOTONIC, ts + 1);
        fn = "memmove";
    }
    ns = (ts[1].tv_sec - ts[0].tv_sec) * 1000000000 + ts[1].tv_nsec - ts[0].tv_nsec;
    printf("%lu.%03luns per %s\n", ns / count, ((ns * 1000) / count) % 1000, fn);
    return 0;
}

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

Сретесь еще какой молоток имеет более правильную форму?

Мирно беседуем по вопросам выработки методики разработки полезного программного обеспечения :-)

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

/me записал: крестофанбои не осиливают big-o notation.

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

Хватит брехать-то! Назови хоть одну охрененную вещь, написанную на крестах.

Назови мишон критикал софт, написанный на сишке :)

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

Наверное с взрослостью и солидностью дейсвительно приходит осознание некоторых вещей, например бессмысленности тредов «С++ говно!». ;)

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

time ./a.out

Просто убил меня.

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

теперь тоже всегда буду использовать memmove.

Используй Си++. C++11 уже рулит.

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

Таких направлений знаю два - игры и hft.

HFT — это ты про трейдинг? Забавно.

Потому что я один раз чуть не устроился в Jane Street, которая занимается именно этим. И пишет на окамле.

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