• Большие шаблонные классы( реализуя CRTP). Все пихать в один .h файл?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Сегодня с помощью шаблонов делается очень много предварительных вычислений на этапе компиляции, чтобы не делать эти вычисления вручную и не проводить их на этапе исполнения. Не всегда такие шаблоны могут похвастаться компактностью кода.
    Прежде всего, шаблоны служат для того чтобы автоматизировать генерацию кода. Не всегда требующий генерации код будет именно компактным или простым. Любой умный указатель или стандартный контейнер легко выбьется за пределы обозначенных 400 строк лишь только своим телом. А если учесть еще и команду поддержки такого стандартного шаблона, то там счет пойдет уже на тысячи строк.

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

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

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

    По поводу организации кода.
    Код шаблонов точно так же можно организовать в наборы файлов. Для шаблонов точно так же разрешена и дружественность, и предварительное объявление, и определение не по месту объявления.
    Реализацию шаблонов можно развести между заголовками (.h-файлами) и файлами встраиваемых реализаций (.inl-файлами).
    При этом важным остается правило доступности шаблона из места его инстанцирования. Т.е. вся группа файлов с реализацией шаблона должна быть как-либо связана с заголовком объявления шаблона, который далее планируется предоставлять пользователю шаблона.
    Ответ написан
    2 комментария
  • Правильный сон при умственных нагрузках - как правильно спать?

    Neuroware
    @Neuroware
    Программист в свободное от работы время
    Нужно ложиться тогда когда хочется спать и просыпаться без будильника тогда когда организм захочет. Все остальное происки заинтересованных лиц, которым нужно, чтобы рабы работали больше, а думали меньше
    Ответ написан
    5 комментариев
  • Как определить такой деструктор в С++?

    zagayevskiy
    @zagayevskiy
    Android developer at Yandex
    Такой интерфейс в С++ не имеет смысла чисто синтаксически. Все эти ... надо заменять на что-то. Передавать аргументы в деструктор нельзя. Так что просто выкидывай их и не парься.
    Ответ написан
    2 комментария
  • Какое время жизни у переменной?

    В стеке отдельно резервируется место под возвращаемое функцией значение, и именно туда, а не по адресу переменной out, записывается результат через return. И, соответственно, дальше работа происходит именно по адресу с возращенным значением.
    Ответ написан
    Комментировать
  • Какое время жизни у переменной?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    auto out = in;
    Тип переменной `out` будет `std::forward_list<T>`. [Пояснение 1], [Пояснение 2]

    Поэтому `out ` будет локальной переменной и будет иметь локальное время жизни.
    Исключением может быть только temporary lifetime extension. Тогда время жизни переменной продлится.
    The lifetime of a temporary object may be extended by binding to a const lvalue reference or to an rvalue reference (since C++11), see reference initialization for details.
    Ответ написан
    5 комментариев
  • Термин для слова "говнокод"?

    @bondbig
    Что делает код говнокодом — никто точно не знает. Точного определения нет. Часто то, что одни считают очевидным говнокодом, другим кажется лаконичным и эффективным решением.
    Ответ написан
    1 комментарий
  • В чем принципиальное отличие второй нормальной формы от третьей?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Вторая форма ликвидирует зависимости неключевых полей от части ключа.
    Третья нормальная форма исключает зависимость неключевых полей от других неключевых полей.
    Ответ написан
    Комментировать
  • Чему равен результат выражения "x-1", /* { int x=1; x-1} */ true или false?

    AtomKrieg
    @AtomKrieg
    Давай я поищу в Google за тебя
    Переменная i не инициализированна, но это полбеды. А вот переменная х не меняется в процессе и поэтому бесконечный цикл.
    Ответ написан
    Комментировать
  • Чему равен результат выражения "x-1", /* { int x=1; x-1} */ true или false?

    fox_12
    @fox_12
    Расставляю биты, управляю заряженными частицами
    Оно в цикле бесконечно из "3" "1" будет вычитать
    Ответ написан
    Комментировать
  • Чем отличается char* от int*, float* и других в Си?

    @abcd0x00
    Указатель - это переменная, которая хранит адрес одного байта в памяти. Часто и сам адрес называют указателем, потому что сам адрес обычно не используется и подразумевает только то, что находится по этому адресу (поэтому они стали синонимами).
    По одному адресу ты не можешь сказать, сколько байт там можно рассматривать целиком, так как сам адрес даёт информацию только об одном байте. Поэтому у указателя есть тип, который означает, что по тому адресу лежит столько-то байт, которые надо рассматривать как единое целое.
    Ответ написан
    Комментировать