Задать вопрос
  • Член класса/структуры типа uint8_t * или int8_t *, оптимизация?

    Lite_stream
    @Lite_stream Автор вопроса
    Если нет необходимости в подобной локальной переменной, то не нужно "кэшировать".
    На уровне ассемблера все обращения к памяти происходят через регистры, так что в любом случае адрес из указателя будет записан в регистр и этот регистр будет индексироваться.


    В версии без кэширования в локальную переменную появляется дополнительная инструкция перед каждым присваиванием
  • Член класса/структуры типа uint8_t * или int8_t *, оптимизация?

    Lite_stream
    @Lite_stream Автор вопроса
    Частично это можно решить кешированием, можно попробовать поменять типы кое где.


    А добавление в сигнатуру метода __restrict (void method () __restrict {}) не является эквивалентным кэшированию в локлаьную переменную ? за исключением того, что ничего кэшировать не придётся, так как компилятор уже будет знать, что переменная ни с чем в рамках данного метода не overlapp'ится" в памяти ?
  • Statements внутри списка инициализации конструктора?

    Lite_stream
    @Lite_stream Автор вопроса
    Евгений Шатунов,
    там, к сожалению, более сложная логика, чем просто вызовы методов, поэтому использовать цепочки вызовов не получится
  • Statements внутри списка инициализации конструктора?

    Lite_stream
    @Lite_stream Автор вопроса
    res2001,

    извиняюсь, забыл уточнить: createObj() - приватный статический метод *


    floppa322, Если это статический метод Example/ExtremelyHeavyObjectBuilder/ExtremelyHeavyObject, то можете так делать.
    В случае статического метода ExtremelyHeavyObjectBuilder/ExtremelyHeavyObject требуется указать класс, т.е. будет что-то вроде ExtremelyHeavyObjectBuilder::createObj().

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


    Так же createObj может быть и свободной функцией.

    естественно может, просто предпочитаю в ооп-стиле писать )
  • Statements внутри списка инициализации конструктора?

    Lite_stream
    @Lite_stream Автор вопроса
    res2001,

    То что вы предлагаете (объявление builder и прочее), можно вынести в вышестоящий код, который будет создавать экземпляр Example, и в конструктор Example передавать результат builder.build(), в списке инициализации просто передадите параметр конструктора Example в параметр конструктора obj.


    можно, но, как я написал выше, более чистым решением мне видется вызов приватного метода
    Example()
    :  obj(createObj()) 
    {}
  • Statements внутри списка инициализации конструктора?

    Lite_stream
    @Lite_stream Автор вопроса
    Евгений Шатунов,
    Спасибо, кажется, обычного вызова метода будет достаточно внутри инициализации члена класса


    Сегодня использование англиканизмов в профессиональной среде трактуется как признак низкой квалификации. Квалифицированный специалист способен объясняться исключительно терминами родного языка.
    Индирект - косвенность. Statement'ы - выражения.
    Когда человек сыпет тяжелыми на слух англиканизмами, его становится тяжело понять. Это заставляет слушателя напрягаться и нервничать. А это уже ведет к обострению общения и может быть воспринято как неуважение.

    statement, indirect - это как раз те англицизмы, переведя которые на русский одним словом, только ухудшит понимание, поэтому я бы не стал это делать


    По поводу стиля кода. Оформление, откровенно говоря, рваное. Это точно так же заставляет задумываться, вчитываться и искать. Думаю, поэтому у тебя пока еще нет ответов. Лично мне потребовалось 4 раза перечитать код чтобы увидеть в нем инициализатор. Первые три раза я видел просто неправильный синтаксис. В широкой практике инициализатор оформляется примерно схожим образом: блоком по строкам. Посмотри пример.

    ну естественно, там вообще ни о каком стиле речи не идёт, потому что то что написано после Example(): и до тела конструктора - вообще псевдо код, предположительный синтаксис, который бы подошёл. Наверное, нужно было это указать
  • Можно ли обратиться к статическому полю шаблона класса без инстанцирования шаблона?

    Lite_stream
    @Lite_stream Автор вопроса
    Евгений Шатунов, хорошо, учту насчёт формулировки вопроса и конфигов для классов )
  • Можно ли обратиться к статическому полю шаблона класса без инстанцирования шаблона?

    Lite_stream
    @Lite_stream Автор вопроса
    Евгений Шатунов, ну и даже с приватными статическими константами хотелоь бы, чтобы на каждый тип шаблона копии переменных не создавались, то есть тут уже речь не идёт о красоте синтаксиса
    Поэтому похоже для таких случаев нужно сделать файлик вроде SharedConstants.h
  • Можно ли обратиться к статическому полю шаблона класса без инстанцирования шаблона?

    Lite_stream
    @Lite_stream Автор вопроса
    Благодарю за ответ :)

    Правда, вариант с наследованием, к сожалению тоже выглядит не таким чистым решением :(
  • Можно ли обратиться к статическому полю шаблона класса без инстанцирования шаблона?

    Lite_stream
    @Lite_stream Автор вопроса
    Евгений Шатунов,

    floppa322 , шаблон класса - это, прежде всего, шаблон типа. Это еще не тип и работать с шаблоном как с типом невозможно. Шаблон всегда требуется инстанцировать, результатом инстанцирования шаблона типа всегда будет тип, у которого уже можно получить доступ к полям и функциям.

    добавляя "фиктивные" шаблонные параметры как-то слишком костыльно

    После инстанцирования шаблона с параметрами, статическое поле MEMBER_TO_BE_ACCESSIBLE_OUTSIDE будет принадлежать только пространству инстанцированного типа. Иными словами, для каждой уникальной комбинации аргументов шаблона MEMBER_TO_BE_ACCESSIBLE_OUTSIDE будет иметь свой уникальный адрес размещения.


    Это-то я понимаю, просто думал, что вдруг есть какой-то хитрый сахар, чтобы провернуть то, что описано в вопросе )

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

    Например:
    1.Класс A использует regex и, чтобы написать тест на него и не ctrl + c / ctrl + v regex можно просто доступиться до публичного regex'а класса A в тесте
    2. Или ещё более экзотический пример (тут уже не абстрактный, а конкретный пример): World (класс, агрегирующий всю игровую логику) работает на частоте Hz1, а класс Connection(класс, который шлёп пакеты клиентам с некоторой частотой) работает на частоте Hz2, которая вычисляет на основе Hz1. Можно было бы вынести Hz1 в файл вроде SharedConstants, но в данном случае код будет чище, если Hz1 оставить в лкассе World, так как всё-таки Hz1 больше относится к World, чем к SharedConstants
  • Является ли хорошей практикой использование Stack Trace библотек в дебаг сборке?

    Lite_stream
    @Lite_stream Автор вопроса
    Евгений Шатунов,

    Извиняюсь за глупый вопрос, но откуда у пользователя возьмётся корректный стек вызовов?

    Вот эта самая Backward-cpp и ей подобные выдачу коллстека и сделают корректной. Современная инструментация отладки позволяет опознать фрагменты встроенного кода и правильно оформить коллстек для выдачи.


    Проверял с -02 дамп стек трейса, в частности, Backward-cpp не восстановил именно исходный, до оптимизаций вид стека вызовов, но может быть я не до конца изучил его api, хотя оно достаточно простое и прямолинейное

    И на производительности конкретно установка обработчиков тоже не сказывается.

    я почему поинтересовался, потому что, например, само наличие блоков try/catch, насколько мне известно, немного замедляет приложение (не в момент пробрасывания исключения, а вообще)
  • Является ли хорошей практикой использование Stack Trace библотек в дебаг сборке?

    Lite_stream
    @Lite_stream Автор вопроса
    Евгений Шатунов,

    а, ещё вопрос: на практике в релизных сборках устанавливают ли колбэки на системные исключения, вроде сегфолта, с последующим выводом стека вызовов ? понятно, что с -o2 он будет менее информативен, но тем не менее

    и не влияет же на производительность приложения само наличие колбэка на системное исключение, с телом, логирующим стек вызовов ?
  • Является ли хорошей практикой использование Stack Trace библотек в дебаг сборке?

    Lite_stream
    @Lite_stream Автор вопроса
    Евгений Шатунов, стало быть, если приложение чисто серверное, то бояться декомпиляции не стоит ?
  • Является ли хорошей практикой использование Stack Trace библотек в дебаг сборке?

    Lite_stream
    @Lite_stream Автор вопроса
    Евгений Шатунов,

    подводные камни - это возможность полной декомпиляции твоей программы по ее отладочным меткам. В наши дни эта проблема решается обрезанием отладочной информации в процессе релиза для пользователей. В результате пользователи при падении видят только отчет со стеком вызовов и все. Это действие - джентельменский минимум уважающего себя производителя ПО.


    Извиняюсь за глупый вопрос, но откуда у пользователя (то есть владельца релизной сборки) возьмётся корректный (как в исходной программе) стек вызовов ? Ведь в релизная сборка компилируется со включённой оптимизацией, а значит и стек вызовов с вероятностью 99% не будет совпадать с исходной программой

    Ну то есть сам стек вызовов-то будет, но пользы от него будет 0
  • Является ли хорошей практикой использование Stack Trace библотек в дебаг сборке?

    Lite_stream
    @Lite_stream Автор вопроса
    Хорошо

    В вопросе я забыл поставить акцент именно на какие-то неочевидные сайд-эффекты, подводные камни данного подхода.
    А также забыл указать в вопросе про те же подводные, связанные с регистрацией хэндлеров на сигналы вроде сегфолта или необработанного исключения и дальнейшем выводом стек трейса :)

    Ну то есть, есть совсем очевидные, вроде того, что с -02 стек трейс будет некорректным, но может быть есть ещё какие-то менее очевидные ?
  • Header-only. Страдает ли размер бинарника?

    Lite_stream
    @Lite_stream Автор вопроса
    Василий Мельников, ну вот с этим я и хотел разобраться )
  • Header-only. Страдает ли размер бинарника?

    Lite_stream
    @Lite_stream Автор вопроса
    ну что на каждый тип создаётся новый шаблонный метод это-то понятно )
    меня интересовало именно то, что шаблоны приходится делать хедер онли, и из-за этого происходится ctrl + c / ctrl + v подставлять компилятору для каждого инклуда
  • Header-only. Страдает ли размер бинарника?

    Lite_stream
    @Lite_stream Автор вопроса
    благодарю за ответ и разъяснение )
  • Header-only. Страдает ли размер бинарника?

    Lite_stream
    @Lite_stream Автор вопроса
    Sergio, ну вообще, я имел в виду в среднем, как оно себя ведёт. Понятно, что скорее всего крайние случае есть, но хотелось бы узнать так сказать general поведение, и если возможно условие крайних случаев, если они есть )