Форум программистов, компьютерный форум CyberForum.ru

Compile-time и run-time методы и функции - C++

Восстановить пароль Регистрация
 
[progeR]
6 / 7 / 0
Регистрация: 20.08.2011
Сообщений: 590
24.08.2016, 13:51     Compile-time и run-time методы и функции #1
Добрый день.
Есть две функции, которые делают идентичную работу:
C++
1
2
3
4
5
6
7
8
9
10
11
template<bool leftShift, typename T>
T byteShift(T data)
{
    return leftShift ? data << 8 : data >> 8;
}
 
template<bool leftShift, typename T, T data>
T byteShift()
{
    return leftShift ? data << 8 : data >> 8;
}
Вопрос: нужно ли держать в коде обе версии функции, или достаточно ограничиться только run-time версией?
Будет ли такой вызов оптимизирован (посчитан) на этапе компиляции?
C++
1
byteShift<true>(0x00FFAE65);
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2016, 13:51     Compile-time и run-time методы и функции
Посмотрите здесь:

Run-Time Check Failure #3 C++
C++ Run-Time Check Failure #3
C++ Run-time error
run-time type information C++
C++ Compile - time алгоритмы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6458 / 3832 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
24.08.2016, 13:55     Compile-time и run-time методы и функции #2
Цитата Сообщение от [progeR] Посмотреть сообщение
нужно ли держать в коде обе версии функции, или достаточно ограничиться только run-time версией?
Оставляешь одну constexpr версию.
C++
1
2
3
4
5
template<bool leftShift, typename T>
constexpr T byteShift(T data)
{
    return leftShift ? data << 8 : data >> 8;
}
Убедиться, что она работает и на этапе компиляции, можно, например, так:
C++
1
    enum { check = byteShift<true>(0x00FFAE65) };
[progeR]
6 / 7 / 0
Регистрация: 20.08.2011
Сообщений: 590
24.08.2016, 14:00  [ТС]     Compile-time и run-time методы и функции #3
Аналогичный вопрос и про функции/методы, которые принимают переменное кол-во аргументов: их можно написать с помощью variadic template рекурсивно и аля prinft.
Данные, которые будут передавать в них известны на этапе компиляции. Будет ли рекурсия посчитана сразу?

Добавлено через 3 минуты
О, быстро же Вы ответили, не успел вторую часть дописать.

Собственно причина вопроса: иногда аргументы функции я знаю заранее. А иногда они определяются во время работы приложения. Следовательно, по идеи, нужно в коде иметь две версии функции compile-time и run-time. В первом случае использовать compile-time, а во втором - run-time.

Или все-таки можно ограничится run-time версией, чтобы не перегружать код (класс) еще одним методом/функцией?
DrOffset
6458 / 3832 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
24.08.2016, 14:04     Compile-time и run-time методы и функции #4
Цитата Сообщение от [progeR] Посмотреть сообщение
Или все-таки можно ограничится run-time версией, чтобы не перегружать код (класс) еще одним методом/функцией?
Ну я же тебе ответил.
constexpr функция будет вести себя как compile-time функция, если это возможно, и как обычная runtime-функция в остальных случаях. Вычислимость на этапе компиляции я тебе показал как проверить, дерзай.

Добавлено через 1 минуту
Плюс к этому, некоторые операции могут быть оптимизированы, даже если они имеют runtime природу. Например недостижимые ветки if, холостые циклы, короткие циклы могут быть развернуты, функции встроены и т.п. Конкретно что получилось лучше смотреть в ассемблерном выхлопе.
[progeR]
6 / 7 / 0
Регистрация: 20.08.2011
Сообщений: 590
24.08.2016, 16:11  [ТС]     Compile-time и run-time методы и функции #5
Не обратил внимание на сигнатуру функции.

Тогда получается лучше всегда писать ключевое слово "constexpr" для всех функций.

А если функция заведомо не constexpr (например содержит cout)? Например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
template<typename T>
constexpr void function(T value)
{
    std::cout << value << std::endl;
}
 
template<typename T, typename ...Args>
constexpr void function(T value, Args... values)
{
    function(value);
    function(values...);
}
Ее можно переписать через шаблоны.

Вызов:
C++
1
function(1, 32, 55, 76, 890, 0, 3);
Что лучше?

К сожалению, дизассемблированную программу не понимаю по большей части, поэтому сказать так или нет не могу.
DrOffset
6458 / 3832 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
24.08.2016, 16:17     Compile-time и run-time методы и функции #6
Цитата Сообщение от [progeR] Посмотреть сообщение
void function
Такого рода функциии в релизе будут встроены, все это развернется просто в ряд вызовов операций вывода.
Даже без constexpr.

Цитата Сообщение от [progeR] Посмотреть сообщение
дизассемблированную программу не понимаю по большей части
Тогда тебе будет очень сложно оценивать реальное положение вещей, к сожалению.
Yandex
Объявления
24.08.2016, 16:17     Compile-time и run-time методы и функции
Ответ Создать тему
Опции темы

Текущее время: 09:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru