LINUX.ORG.RU

А что вы думаете по этому поводу?

 , , ,


1

3

https://github.com/nikitosios/Storage/tree/master/OOP/src

Тут есть реализация ООП на языке си. Да, немного костыльно. Мое мнение: я не использую ООП везде, где надо и не надо, поэтому такого ассортимента возможностей мне хватает. Да и большинству программ должно хватать (имхо, не бейте). Поэиому С++ - перегруженный бесполезный язык, ибо если у вас нормальная программа, то чистого Си будет достаточно, и работает на 5% быстрее, и компилируется быстрее. А если надо ООП, лямбды и прочие модные шняги, то С#, Java, Python к вашим услугам. Что вы думаете по поводу С++ и ООП в Си?



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

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

Программа печатает всего одну строку в консоль. ;) Но тест все равно детский, да.

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

Нет. Я сделал простейшую программу, которая просто жрет ресурсы (у меня исполнялась секунд 20) и проверил скорость ее исполнения после компиляции как С код и как С++ код с помощью утилиты time

nikitosios20031
() автор топика

P.S. Добавил пример наследования в репозиторий

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

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

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

То что твоя программа выполняет одну единственную функцию, оптимизированную для компилятора gcc тебя не смущает? Ну и код после дизассемблера стоит сравнить.

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

Я один и тот же код компилировал разными компиляторами. И эти две программы работали с разной скоростью. Уже несколько раз это писал, будьте внимательнее

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

А если запускать наоборот:

time maincpp
time mainc
то С начинает проигрывать плюсам? :)

Еще раз, посмотри какой генерируется код в этих случаях, он будет одинаковым. :)

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

Есть пример инкапсуляции, наследования и полиморфизма на чистом си.

Это букет костылей который притянули за уши и назвали ООП в Си. Не стоит себя обманывать, но структура набитая функциями - это ещё не ООП

AntonyRF ★★★★
()

есть реализация ООП на языке си

Помню-помню. Первый раз я такое прочитал перед написанием диплома, и было это... в конце 1992 года, четверть века назад.

Да, на сях, как и почти на любом процедурном языке, можно применять ООП. Но по мне так на языках с поддержкой классов, наследования и др. ООП выглядит более естественно. И по мне так в 99% случаев читаемость и поддерживаемость кода важнее, чем быстродействие (в разумных пределах, конечно).

Но если твоя задача попала в оставшийся 1% - надеюсь, ты знаешь, что делаешь, удачи.

hobbit ★★★★★
()

Ну так страуструп примерно с того же самого начинал.

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

Я один и тот же код компилировал разными компиляторами. И эти две программы работали с разной скоростью. Уже несколько раз это писал, будьте внимательнее

Это же всё от неумения правильно ставить эксперимент и обрабатывать результат. Нужно понимать, что время выполнения в самом простом случае выражается как T = T0 + n*K (K это собственно производительность, T0 время старта), потому нужно измерять при разных n. И...

g++ -o maincpp main.c

с и с++ могут делать разный отладочный код, нужно собирать с оптимизациями (-O2 и -O3). Вообще с++ и с индентичны по качеству кода и производительности.

mashina ★★★★★
()

Ты забываешь о такой штуке как безопасность.

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

Сравни приложения на Gtk/GObject и Qt, например. Так расклад более реальный получается. При том, что Qt тоже имеет свой рантайм.

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

Не забывайте, что я не предлагал заменить С++ чистым си, си это не ООП язык. Но если надо сделать пару простеньких ООП приколов, то я не вижу смысла писать всю программу на С++. Ну а если надо полноценный ООП, то давайте сразу java и C#

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

Но если надо сделать пару простеньких ООП приколов, то я не вижу смысла писать всю программу на С++

А я лично не вижу смысла строить костыли. Скормите Си код компилятору C++ и он скорее всего удачно скомпилируется. Я лично еще ни разу не встречал проект на Си, который не компилировался бы в g++

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

Но если надо сделать пару простеньких ООП приколов, то я не вижу смысла писать всю программу на С++

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

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

C++ – это не «C с ООП», а совсем другой язык.

Java и C# не могут заменить C++ во многих нишах где он используется. Игры или браузерный движок ты будешь на C# писать?

mono ★★★★★
()

Ладно, убедили. Я уже очень хорошо знаю Си, и подумал сделать так: заменить в мейкфайле «cc» на «++» и писать свою программу дальше. Если найду подходящее место, влеплю какую-то конструкцию из С++.

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

Я уже очень хорошо знаю Си

Смех в зале ...

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

заменить в мейкфайле «cc» на «++» и писать свою программу дальше. Если найду подходящее место, влеплю какую-то конструкцию из С++.

Угу, и у тебя получится программа на си-суржике, смеси C и C++.

Хорошая новость: ты не один, таких программ легион, и их авторы уверены, что пишут на C++.

Плохая новость: к программированию на C++ этот говнокод имеет весьма слабое отношение. Если ты пишешь на крестах, ты должен по возможности воздерживаться от printf, strcpy, множества глобальных переменных и прочего сишного легаси. От #define воздержаться, к сожалению, не удастся, поскольку модульность в кресты до сих пор не завезли, а стража компиляции без #define не напишешь, но там, где вместо неё можно употреблять const - употребляй.

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

Сравни приложения на Gtk/GObject и Qt, например.

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

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

а стража компиляции без #define не напишешь

#pragma once? И да, я в курсе, что оно «не стандартно».

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

Угу, и у тебя получится программа на си-суржике, смеси C и C++.

printf

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

http://yosefk.com/c fqa/web-vs-c .html#misfeature-4

Freyr69 ★★★
()
Последнее исправление: Freyr69 (всего исправлений: 1)

Думаю, что срач бурная дискуссия не задастся. А вообще, подобие объектного подхода можно сделать при помощи типов, вроде бы. И это уже делали в некоторых проектах почти четверть века назад.

al_exquemelin ★★★
()

А что вы думаете по этому поводу?

Язабан

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

заменил в своем мейкфайле gcc на g++. Скомпилировалось, но в два-три раза дольше. С моей манерой перекомпилировать и тестировать программу после каждых 3 новых строк, это неудобно.

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

g++ и правда долго компилит, не знаю почему. Попробуй clang использовать, правда не могу гарантировать, что он будет быстрее, т.к. не использовал его. А использовал я MSVC2015 - вот это действительно быстро, но к коду оно относится как говну и существует только для маздая.

Кстати, если интересно, то что g++ у меня компилирует секунд 20 в MSVC2015 компилируется почти мгновенно, НО если есть ошибка в коде, то MSVC2015 может забить на нее и работать очень странно - программа то будет работать, то нет, и от чего зависит не понятно. У меня такое было, когда я использовал объект класса до его создания, перейдя на g++ и найдя эту ошибку я понял, что компиляторы от MS не заслуживают права на существование. Почему оно не всегда сегфолтилось будучи скомпилированным в MSVC2015 мне не ясно.

SR_team ★★★★★
()

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

anonymous
()
  nikitosios20031->say(nikitosios20031, "я даун!");

Зачем в метод явно передавать инстанц? В чём тогда разница от

  say(nikitosios20031, "я даун!");

Если для тебя ООП это стрелочка от объекта перед вызовом метода, то у меня плохие новости для тебя.

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