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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
[progeR]
30 / 8 / 0
Регистрация: 20.08.2011
Сообщений: 605
#1

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

24.08.2016, 13:51. Просмотров 209. Ответов 5
Метки нет (Все метки)

Добрый день.
Есть две функции, которые делают идентичную работу:
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 методы и функции
Посмотрите здесь:

Compile - time алгоритмы - C++
мне итересно, с появлением constexpr надобность в шаблонных компиле-тайм алгоритмах полностью отпала?..)

Выделение памяти объёмом, известном в compile-time - C++
Правда ли, что, скажем new int Произойдёт существенно быстрее, чем int length = runtimeComputeLength(); // returns 1000 new int;

Run-time error - C++
Всем здарсте. Подскажите пожалуйста: почему в результате работы такого кода, получаеться run-time ошибка ? #include &lt;iostream&gt;//Defolt...

Run-Time Check Failure # 2 - C++
Нужно чтобы програмка находила расстояние между прямыми в пространстве.Она работает,находит правильно,все хорошо.Вот только вконце...

Run-Time Check Failure #3 - C++
//Написать программу, формирующую из двух WAV файлов новый WAV файл, являющийся суммой двух первых. #include &lt;Windows.h&gt; #include...

Затаившийся run-time error - C++
Здравствуйте! Решаю следующую задачу: на стандартный ввод подаётся число вершин выпуклого многоугольника, а потом пары чисел - координаты...

run-time type information - C++
Добрый день. Не могли бы просветить в RTTI (в гугле натыкаюсь на англоязычную информацию)... Если можно с примерами? И еще такой вопрос...

Run - Time Check Failure #2 - S - C++
Вот сам код, результат выдает правильно, но в самом конце, когда в консоли пишет &quot;Для продолжения введите ...&quot; выскакивает ошибка Run -...

Run-time check failure #0 - C++
Добрый день. Помогите пожалуйста, уже который день не могу разобраться с ошибкой. Есть WinAPI обертка. Этот оконный класс наследуется COM...

Run-Time Check Failure #3 - C++
// // first.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include...

Run-Time Check Failure #3 - C++
Господа, может кто мне поможет. Код (глупый конечно код, но как могу): #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...

ошибка Run-Time Check Failure #2 - C++
под конец програмки освобождал память и ошибка пропадала но происходило аварийное завершение ( подскажите где проблема . class...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
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]
30 / 8 / 0
Регистрация: 20.08.2011
Сообщений: 605
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
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
24.08.2016, 14:04     Compile-time и run-time методы и функции #4
Цитата Сообщение от [progeR] Посмотреть сообщение
Или все-таки можно ограничится run-time версией, чтобы не перегружать код (класс) еще одним методом/функцией?
Ну я же тебе ответил.
constexpr функция будет вести себя как compile-time функция, если это возможно, и как обычная runtime-функция в остальных случаях. Вычислимость на этапе компиляции я тебе показал как проверить, дерзай.

Добавлено через 1 минуту
Плюс к этому, некоторые операции могут быть оптимизированы, даже если они имеют runtime природу. Например недостижимые ветки if, холостые циклы, короткие циклы могут быть развернуты, функции встроены и т.п. Конкретно что получилось лучше смотреть в ассемблерном выхлопе.
[progeR]
30 / 8 / 0
Регистрация: 20.08.2011
Сообщений: 605
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
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
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 методы и функции
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru