LINUX.ORG.RU

Qt и с++ для всего системного

 , ,


1

3

В свете последних новостей о Qt (и связанного с ней, или наоборот, С++) решил тут поделиться моим микро опытом.

Пишем сейчас одну программулину — читает данные с датчкиков по serial port, обрабатывает и шлет нужные команды. Вначале писал под плюсами с Qt+qserialport library. Пока скорость порта была 9600бод я особо не обращал внимание на «скорость» работы и обмена + тестировалось всё под каким-то коре2 (или даже квадом). Когда же запустил все это дело на Celeron 1800 + скорость 115200, то произошли неприятности: загрузка ЦПУ под 100%. Все торомзит и не шевелится (проц то одноядерный). Не понравилось мне все это, и переписал под pure C. Как результат — тежи самые действия на том же железе грузят ЦПУ на 10% (а не под 100%). Вот и не знаю, на что грешить: плюсы с их классами, кривость КуТэ в целом или на саму либу (хотя она вроде как офф, будет в кутэ 5 «изкоробки).

Зато получил ответ на вопрос, который иногда меня мучал (и будил по ночам): „Почему ядро Linux не перепишут под плюсы“.

Перемещено post-factum из talks

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

Защита от хотлинкинга. Нажать энтер в адресной строке.

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

Еще пока не добавили, но надеюсь добавят. Но до этого момента еще нужно многое допилить...

kuzulis ★★
()

Почему ядро Linux не перепишут под плюсы

Потому что плюсы намертво прибиты к библиотекам в user-space, потому что некоторые вещи на плюсах дают больший overhead и наконец потому что даже если это бы имело смысл, переписывать сейчас такую кодовую базу никто бы не стал.

Вот и не знаю, на что грешить: плюсы с их классами, кривость КуТэ в целом или на саму либу

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

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

Прочитать тред не пробовал, прежде чем давать советы?

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

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

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

ес-но, но это не значит, что за пределами ядра жизни нет, тут он говорит, что Java кусок говна:

http://www.youtube.com/watch?v=Aa55RKWZxxI

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

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

А ты думал, Линус это все говорит безосновательно только лишь бы потроллить, да обосрать плюсофагов?

Линус знатный тролль, все это знают

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

Что мешает на плюсах не использовать стандартные библиотеки? В плюсах есть шаблоны и строгий контроль типов, код в итоге получается более типобезопасный и чем на чистом си. На плюсах и под микроконтроллеры пишут. Принципиальной разницы нет, когда знаешь какой асм код сгенерит твой с++ компилятор. По сабжу : куте не самая быстрая либа) но проблема явно с кодом аффтора. На работе есть девайс у него 18 портов через плату расширения, rs485 и километровые кабели работает на amd geode lx. Успевает и опрашивать, и отрисовывать параметры, и сохранять на флешку все системные события.

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

Кстати, а какие возможности С не использует Торвальдс? Просто ИМХО Си не особо богат на разнообразие языка, что там можно не использовать?

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

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

wota ★★
()

Зато получил ответ на вопрос, который иногда меня мучал (и будил по ночам): «Почему ядро Linux не перепишут под плюсы».

Типун тебе на язык.

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

Что мешает на плюсах не использовать стандартные библиотеки?

Особо ничего не мешает - перегрузил глобальные new/delete и вперед. Просто C++ без STL теряет очень много.

На плюсах и под микроконтроллеры пишут.

Писать-то пишут, только из-за невозможности использовать кучу (мало памяти), шаблоны (компилятор часто не умеет) и исключения (не умеет сам МК), использование C++ на МК обычно превращается в C с классами и строгой типизацией + кучей геморроя с зоопарком макросов и расширений языка от производителя МК. Это я говорю об IAR и простейших МК, потому что на серьезных МК обычно работает полноценная ОС и разницы действительно нет вообще.

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

Вот чёрт, я наоборот в коде часто typedef использую — паскалевская привычка.

Имеет значение для чего именно ты их используешь. Использовать typedef для контейнеров в С++ вполне нормльная и часто (в публичных API) даже хорошая практика, а если при этом не тайпдефятся примитивные типы, то и непоняток никаких не возникнет.

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

А typedef примитивных типов в С++ это плохая привычка?
Например, в игровом движке заменить unsigned int на SceneID для контроля типов.

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

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

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

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

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

Потому что плюсы намертво прибиты к библиотекам в user-space,

Перед тем как писать подобный бред, ты бы сначала поинтересовался тем, что такое «hosted implementation» и «freestanding implementation» в С++.

потому что некоторые вещи на плюсах дают больший overhead

Список в студию!

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

Список в студию!

Не знаю, то ли Вы имеети ввиду, но выскажу свое мнение. Язык предполагает стиль. С++ предполагает ООП. ООП предполагает (иногда) кучу «мусора» (или оверхеда, аля геттеры-сеттеры). Вот такой примитивнейший пример.

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

или оверхеда, аля геттеры-сеттеры

они не несут никакого оверхеда

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

Потому что плюсы намертво прибиты к библиотекам в user-space,

так к сведению - ядро линукса в свое время собирали компилятором С++

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

ООП предполагает (иногда) кучу «мусора» (или оверхеда, аля геттеры-сеттеры).

Которые в большинстве случаев являются inline-функциями. Следующий пример?

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

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

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

С++ предполагает ООП

C++ - мультипарадигменный язык, но допустим.

ООП предполагает (иногда) кучу «мусора» (или оверхеда, аля геттеры-сеттеры).

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

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

Например, структура, с указателем на которую работает группа функций, при этом объявления этой структуры нет в публичных заголовках.

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

Список в студию!

Исключения, вызовы виртуальных функций, шаблоны (code size), implicits, RTTI, dynamic_cast, mangling (просто как неприятная особенность), что-то ещё? Ну и сами библиотеки могут вносить оверхед (те же iostreams) - либо сами по себе, либо потому что они всё это используют.

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

к примеру он призывает как можно реже использовать typedef

the_t world_t would_t be_t a_t better_t place_t if_t some_t people_t did_t not_t feel_t the_t need_t to_t typedef_t everything_t

by Theo de Raadt :)

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

Исключения,

Сишный аналог в студию! Иначе просто не используем исключения и все ок. Проектов, где отказались от исключений - туча.

вызовы виртуальных функций,

Никакой разницы по сравнению с вызовом функции по указателю в С.

шаблоны (code size),

А по скорости они как правило быстрее, потому что находятся в том же модуле и отлично инлайнятся. Мы же про скорость?

implicits,

ЩИТО?

RTTI, dynamic_cast,

Люди отлично обходятся и без него. Никто не заставляет. И да - С-шный аналог в студию.

mangling (просто как неприятная особенность), что-то ещё?

Mangling и скорость? Каким образом?

Ну и сами библиотеки могут вносить оверхед (те же iostreams) - либо сами по себе, либо потому что они всё это используют.

Вот прямо у тебя отбирают libc и заставляют юзать только libstdc++.

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

Сишный аналог в студию!

Речь же была про список фич С++ имеющих определённое влияние на рантайм? В принципе, в разных embedded coding style подобные фичи перечисляются, можно использовать С++ как «лучший Си» избегая этих фич и всё будет ок. Но при этом придётся отказаться и от фич С99 тоже (инициализация структур, flexible/VL arrays, заголовки, etc.).

Иначе просто не используем исключения и все ок. Проектов, где отказались от исключений - туча.

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

Никакой разницы по сравнению с вызовом функции по указателю в С.

Смотря с каким компилятором, наверное. Такой код

struct A { void (*m)(void); };
struct B { struct A a; };
struct C { struct A a; };

void B_m(void) { puts("B"); }
void C_m(void) { puts("C"); }

int main()
{
    struct B b = { .a = { .m = B_m } };
    b.a.m();
}

легко сводится к call B_m. А такой:

struct A {
    virtual void m() { puts("A"); }
    virtual ~A() {}
};
 
struct B : public A { void m() { puts("B"); } };
struct C : public A { void m() { puts("C"); } };
 
int main()
{
    B *b = new B;
    b->m();
}

к непонятно чему.

ЩИТО?

Конструкторы от одного аргумента не помеченные как explicit (абстрактные в вакууме, то есть без указания компилятора).

Mangling и скорость? Каким образом?

Никаким, говорю же, просто неприятная особенность. Но системный ЯП это, в том числе, вменяемый ABI. Если только как прикладной - ок.

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

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

Речь о неиспользовании исключений в проекте, а не во внешних либах (включая libstdc++). Т.е. не использовать throw. При этом использования STL, которые могут выкинуть исключения, аккуратно оборачиваются в try...catch, ну и на высоком уровне ловится bad_alloc.

Смотря с каким компилятором, наверное. ....

Проверю дома ради интереса.

Конструкторы от одного аргумента не помеченные как explicit (абстрактные в вакууме, то есть без указания компилятора).

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

Но системный ЯП это, в том числе, вменяемый ABI.

Соглашусь.

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

Проверю дома ради интереса.

Там new надо на объект на стеке поменять, тогда действительно получается идентичный код в области main (gcc ещё this в регистр передаёт, clang этого не делает). Как-то не могу придумать пример демонстрирующий оверхед virtual - с -O2/3 всё хорошо получается.

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

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

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