-
- Разве внутри USB_FS_OBJECT.Enumerate_Reset() не делается что-то с
USB_FS_OBJECT? Или смущает что вместо x придется писать
arg->x, или вместо foo() придется писать arg->foo(arg)? AlexBi(237 знак., 03.10.2022 11:13, картинка)
- C++ программиста вообще ничего не смущает, а уж объём текста и
подавно :) А вот во что это в кончном счёте скомпилируется очень
даже. Во-первых, передать аргумент в Enumerate_Reset не бесплатно.
Во-вторых внутри придётся много проверок аргумента делать, чтобы
выбирать с каким из двух USB-портов оперировать. В-третьих,
Enumerate_Reset static inline и его вызова вообще не будет. Что-то
оптимизатор вытянет, но далеко не всё. Код будет медленней, а это
прерывание. Ну и VladislavS.(45 знак., 03.10.2022 11:29)
- Если так переживать за скорость, что учитывать количество
передаваемых аргументов, то в С++ придется делать изрядное
количество static, т.к. любой вызов не static метода неявно требует
передачи одного параметра, а в программах очень часто встречается
единственный объект класса. Не уверен, что оптимизатор способен
обнаружить это самостоятельно и сделать код как для static, хотя
формально препятствий нет. AlexBi(261 знак., 03.10.2022 11:43)
- inline IRQHandler улыбнуло. А куда его можно встроить? Впрочем,
inline это такое слово-паразит в С. Пиши не пиши - ничего не
изменится. В С++ у него хоть другие применения есть. - VladislavS.(03.10.2022 12:27)
- Встраивать я предполагал туда AlexBi(244 знак., 03.10.2022 12:39, картинка)
- Мне кажется, польза inline незаслуженно преувеличена. Он не нужен.
Сэкономить пару тактов? Это бывает нужно два раза в год, и inline
там будет нужен в последнюю очередь. Следовательно, если погромиздъ
применяет inline чаще, чем 2 раза в год, он демонстрирует
неадекватную оценку реальных требований к софту. - SciFi(03.10.2022 12:45)
- На мелких контроллерах типа ПИК это экономия стека, который весьма
мелкий. Но программу при этом удобнее писать в виде отдельных
функций, вызывающих друг друга. Приходится следить за глубиной
вложенности. AlexBi(115 знак., 03.10.2022 12:49)
- Так большинство аргументов обычно и разбивается об скалу "и это всё
ради пары тактов?". А пара тактов тут, пара тактов там, тем более
что это всё делает компилятор и уже набегает разница. - VladislavS.(03.10.2022 12:59)
- Всё так. Только на самом деле не набегает :-) - SciFi(03.10.2022 13:02)
- Есть опыт или с потолка? - VladislavS.(03.10.2022 13:09)
- Опыт есть. И да, "набегает" - это с потолка :-) - SciFi(03.10.2022 13:37)
- Получается моё кун-фу сильнее твоего :) VladislavS.(48 знак., 03.10.2022 13:55, youtube)
- Опыт есть. И да, "набегает" - это с потолка :-) - SciFi(03.10.2022 13:37)
- Есть опыт или с потолка? - VladislavS.(03.10.2022 13:09)
- Всё так. Только на самом деле не набегает :-) - SciFi(03.10.2022 13:02)
- Так большинство аргументов обычно и разбивается об скалу "и это всё
ради пары тактов?". А пара тактов тут, пара тактов там, тем более
что это всё делает компилятор и уже набегает разница. - VladislavS.(03.10.2022 12:59)
- На мелких контроллерах типа ПИК это экономия стека, который весьма
мелкий. Но программу при этом удобнее писать в виде отдельных
функций, вызывающих друг друга. Приходится следить за глубиной
вложенности. AlexBi(115 знак., 03.10.2022 12:49)
- Мне кажется, польза inline незаслуженно преувеличена. Он не нужен.
Сэкономить пару тактов? Это бывает нужно два раза в год, и inline
там будет нужен в последнюю очередь. Следовательно, если погромиздъ
применяет inline чаще, чем 2 раза в год, он демонстрирует
неадекватную оценку реальных требований к софту. - SciFi(03.10.2022 12:45)
- Встраивать я предполагал туда AlexBi(244 знак., 03.10.2022 12:39, картинка)
- В случае с С++ есть возможность писать код методов в заголовочном
файле. Тогда весь код будет в одной единице трансляции и
возможности оптимизации сильно выше. Статик или не статик тогда на
оптимизацию не сильно влияет. Пример на эту тему: VladislavS.(248 знак., 03.10.2022 12:18, картинка)
- Даже если весь код под рукой, компилятор отказывается инлайнить
единственный вызов функции. Правда это все С-компиляторы, с
которыми я имел дело, как у С++ не знаю. - AlexBi(03.10.2022 12:44)
- Да дадно, а если попросить? :) VladislavS.(1 знак., 03.10.2022 13:08, картинка)
- Даже если весь код под рукой, компилятор отказывается инлайнить
единственный вызов функции. Правда это все С-компиляторы, с
которыми я имел дело, как у С++ не знаю. - AlexBi(03.10.2022 12:44)
- Мне тоже кажется жутко неудобным, что нельзя весь класс объявить статическим, не по области видимости, а по методам. - =AlexD=(03.10.2022 11:49)
- inline IRQHandler улыбнуло. А куда его можно встроить? Впрочем,
inline это такое слово-паразит в С. Пиши не пиши - ничего не
изменится. В С++ у него хоть другие применения есть. - VladislavS.(03.10.2022 12:27)
- Если так переживать за скорость, что учитывать количество
передаваемых аргументов, то в С++ придется делать изрядное
количество static, т.к. любой вызов не static метода неявно требует
передачи одного параметра, а в программах очень часто встречается
единственный объект класса. Не уверен, что оптимизатор способен
обнаружить это самостоятельно и сделать код как для static, хотя
формально препятствий нет. AlexBi(261 знак., 03.10.2022 11:43)
- C++ программиста вообще ничего не смущает, а уж объём текста и
подавно :) А вот во что это в кончном счёте скомпилируется очень
даже. Во-первых, передать аргумент в Enumerate_Reset не бесплатно.
Во-вторых внутри придётся много проверок аргумента делать, чтобы
выбирать с каким из двух USB-портов оперировать. В-третьих,
Enumerate_Reset static inline и его вызова вообще не будет. Что-то
оптимизатор вытянет, но далеко не всё. Код будет медленней, а это
прерывание. Ну и VladislavS.(45 знак., 03.10.2022 11:29)
- Разве внутри USB_FS_OBJECT.Enumerate_Reset() не делается что-то с
USB_FS_OBJECT? Или смущает что вместо x придется писать
arg->x, или вместо foo() придется писать arg->foo(arg)? AlexBi(237 знак., 03.10.2022 11:13, картинка)