java стиль
От: maks1180  
Дата: 23.11.22 17:05
Оценка: :)
Переписал я часть своего проект в java стиль, т.е. когда реализация метода класса сразу в её декларации. Может быть есть правильное название этого стиля ?

java стиль мне больше нравиться особенно когда много мелких функций, и нужно часто менять их декларации или добавлять новые.
Если нужно хеадер посмотреть, то можно сделать в IDE Folding->Fold all и вы получите фактически header файл, с возможность раскрыть любую функцию.

1. Размер exe, в байтах
1) 263.680 — компиляция через много cpp файлов + линковка
2) 261.632 — компиляция через 1 cpp файл, который включает другие cpp файлы
далее, половина проекта переписана в java стиль
3) 250.880 — компиляция через 1 cpp файл
4) 253.440 — компиляция через 2 cpp файла + линковка

Использую gcc v10.2 on Windows 10. Оптимизация по размеру exe. Конечно же опции одинаковые, вот основная часть: -Os -ffunction-sections -Wl,--strip-all -Wl,--gc-sections

В map файле п2 есть неиcпользуемая функция, этим я объясняю почему п2 больше чем п3. Почему gcc не выкидывает её я не смог понять.
Разницу в размере между п1 и п3 не могу пока объяснить, думаю потому-что я не писал noexcept и компилятор смог оптимизировать когда сразу все функции увидел.
Разницу между п3 и п4 объясняю так — когда сразу не все функции даёшь, то оптимизация хуже работает.
Размер exe, в п3 зависит от порядка включения h файлов. Почему так ?
Может есть ещё какие-то объяснения изменения в размерах ?


2. Пробемы компиляции
Вылезли некоторые атрефакты компиляции, их я в отдельных ветках опишу.

Возникает проблема когда метод класса A использует класс B и наоборот. Приходится такие методы выностить в cpp файл — неудобно.
Может есть решение данной проблемы ?

Если нет решение, вижу следующее решение: пишу свой парсер/препроцессор и разбиваю 1 файл java стиль на 2 файла cpp+h и потом уже они компилируются.
Это нужно делать в прозрачном для пользователя режиме, а так же в случае ошибки ссылаться на место в оригинальном файле.
Но как показывает опыт gcc хуже оптимизирует cpp+h или я что-то не понимаю, нужно получить ответы на п1.
Может уже есть такие решения ? Велосипед не охото изобретать.
===============================================
(реклама, удалена модератором)
Отредактировано 23.11.2022 17:28 maks1180 . Предыдущая версия . Еще …
Отредактировано 23.11.2022 17:27 maks1180 . Предыдущая версия .
Отредактировано 23.11.2022 17:24 maks1180 . Предыдущая версия .
Отредактировано 23.11.2022 17:24 maks1180 . Предыдущая версия .
Отредактировано 23.11.2022 17:21 maks1180 . Предыдущая версия .
Отредактировано 23.11.2022 17:17 maks1180 . Предыдущая версия .
Отредактировано 23.11.2022 17:16 maks1180 . Предыдущая версия .
Отредактировано 23.11.2022 17:15 maks1180 . Предыдущая версия .
Отредактировано 23.11.2022 17:13 maks1180 . Предыдущая версия .
Отредактировано 23.11.2022 17:12 maks1180 . Предыдущая версия .
Отредактировано 23.11.2022 17:09 maks1180 . Предыдущая версия .
Отредактировано 23.11.2022 17:09 maks1180 . Предыдущая версия .
Отредактировано 23.11.2022 17:08 maks1180 . Предыдущая версия .
Re: java стиль
От: kov_serg Россия  
Дата: 23.11.22 17:53
Оценка: :)
Здравствуйте, maks1180, Вы писали:

M>Переписал я часть своего проект в java стиль, т.е. когда реализация метода класса сразу в её декларации. Может быть есть правильное название этого стиля ?

header only
boost подключи — увидишь радость бытия
Re: java стиль
От: vopl Россия  
Дата: 23.11.22 18:06
Оценка: +1 :)
M>Возникает проблема когда метод класса A использует класс B и наоборот. Приходится такие методы выностить в cpp файл — неудобно.
M>Может есть решение данной проблемы ?


Для особых ценителей — можно сыграть на том что шаблоны инстанцируются по факту использования использования а не по мере объявления, примерно так:

template <class SS=void> 
struct MyScope
{
    template <class SS2=void> 
    struct MrFirst
    {
        //никаких предварительных деклараций, заранее используем сущность которая будет объявлена позже
        MyScope<SS2>::template MrSecond<> second{*this};
        void f()
        {
            typename MyScope<SS2>::template MrSecond<> moreSecond{*this};
            moreSecond.f();
        }
    };

    template <class SS2=void> 
    struct MrSecond
    {
        MrSecond(MyScope<SS2>::template MrFirst<>& first)
            : first{first}
        {}

        //если декларация на текущий момент уже существует то можно ее использовать прямо:
        //MrFirst<>& first;
        //но для единообразия пусть будет так:
        MyScope<SS2>::template MrFirst<>& first;

        void f()
        {
            typename MyScope<SS2>::template MrFirst<> moreFirst{};
            //moreFirst.f();
        }
    };
};

int main()
{
    MyScope<>::MrFirst<> first;
    first.second.first.f();
    return 1;
}
Re[2]: java стиль
От: maks1180  
Дата: 23.11.22 23:37
Оценка:
V>Для особых ценителей — можно сыграть на том что шаблоны инстанцируются по факту использования использования а не по мере объявления, примерно так:

Спасибо! Не идеальное решение, как для написания так и для чтения кода. Возможно так же что и компилироваться такой код будет в менее оптимизированный.
===============================================
(реклама, удалена модератором)
Отредактировано 23.11.2022 23:43 maks1180 . Предыдущая версия .
Re: java стиль
От: _NN_ www.nemerleweb.com
Дата: 24.11.22 17:27
Оценка:
Здравствуйте, maks1180, Вы писали:

M>Переписал я часть своего проект в java стиль, т.е. когда реализация метода класса сразу в её декларации. Может быть есть правильное название этого стиля ?


Если вам нужно работать и поддерживать код C++, то только с разделением на заголовочный файл и реализацию.
Более того в заголовчном файле по возможности стоит избегать #include и использовать предварительное объявление.

Если работать в header only стиле, то каждое изменение может привести к перекомпиляции большого количества файлов вместо нескольких.
Это не существенно когда у вас всего несколько файлов, но когда проект большой, то будет тяжело работать.

А в чём проблема разделения кода ?
Сегодня все редакторы кода умеют это делать за вас в один щелчок.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: java стиль
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 28.11.22 01:34
Оценка: +1
Здравствуйте, maks1180, Вы писали:

M>Переписал я часть своего проект в java стиль, т.е. когда реализация метода класса сразу в её декларации. Может быть есть правильное название этого стиля ?


Это не java-стиль, это header-only стиль, я так писал, когда никакой джавы еще в планах не было


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

M>Если нужно хеадер посмотреть, то можно сделать в IDE Folding->Fold all и вы получите фактически header файл, с возможность раскрыть любую функцию.

Что мешает так делать в плюсах?


M>Возникает проблема когда метод класса A использует класс B и наоборот. Приходится такие методы выностить в cpp файл — неудобно.


Вообще не обязательно выносить в отдельный C++ файл


M>Может есть решение данной проблемы ?


Есть конечно. Пишешь в теле класса прототип, а реализацию — после определения всех зависимых классов с пометкой inline.

Я вообще, когда меня начинает напрягать много кода в интерфейсе класса, выношу все реализации в *_impl.h, который кладу рядом и включаю в конце основного файла


M>Если нет решение, вижу следующее решение: пишу свой парсер/препроцессор и разбиваю 1 файл java стиль на 2 файла cpp+h и потом уже они компилируются.

M>Это нужно делать в прозрачном для пользователя режиме, а так же в случае ошибки ссылаться на место в оригинальном файле.
M>Но как показывает опыт gcc хуже оптимизирует cpp+h или я что-то не понимаю, нужно получить ответы на п1.
M>Может уже есть такие решения ? Велосипед не охото изобретать.

Ты дурью маешься
Маньяк Робокряк колесит по городу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.