RadiatoR 2 1 февраля, 2020 Опубликовано 1 февраля, 2020 · Жалоба Всем привет. Заметил в проекте, что в коде: constexpr float kv() { return 3.3f / 4096.0f; } constexpr float k0() { return 6.0f * kv(); } constexpr float k1() { return 10.0f * kv(); } constexpr float k2() { return 5.0f * kv(); } вычисления всё равно делаются в реалтайме. Использую Visual GDB, gcc 9.2.1. Подскажите, может что-то не включил или не правильно понимаю работу constexpr? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 1 февраля, 2020 Опубликовано 1 февраля, 2020 · Жалоба Я сам ещё не совсем в теме, но может быть вам поможет эта статья. Как я понял, constexpr вовсе не гарантирует, данные будут вычислены на этапе компиляции. В статье несколько случаев рассматривается, возможно они помогут вам решить вашу задачу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 1 февраля, 2020 Опубликовано 1 февраля, 2020 · Жалоба 5 часов назад, RadiatoR сказал: Подскажите, может что-то не включил или не правильно понимаю работу constexpr? Проверьте наличие ключа компилятора -std=c++17. А подстраховаться можно, объявив constexpr переменную, и присвоив ей результат вызова функции: static constexpr kv_ = kv(); В этом случае компилятор сразу заругается, если не сможет вычислить kv() в процессе компиляции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 2 1 февраля, 2020 Опубликовано 1 февраля, 2020 · Жалоба 6 hours ago, haker_fox said: Я сам ещё не совсем в теме, но может быть вам поможет эта статья. Как я понял, constexpr вовсе не гарантирует, данные будут вычислены на этапе компиляции. В статье несколько случаев рассматривается, возможно они помогут вам решить вашу задачу. За статейку спасибо. 58 minutes ago, AHTOXA said: Проверьте наличие ключа компилятора -std=c++17. А подстраховаться можно, объявив constexpr переменную, и присвоив ей результат вызова функции: static constexpr kv_ = kv(); В этом случае компилятор сразу заругается, если не сможет вычислить kv() в процессе компиляции. Ключ есть, кстати constexpr был введен в с++11. В общем поигрался и заменил функции на: static const float kv = 3.3f / 4096.0f; static const float k0 = kv * 6.0f; static const float k1 = kv * 10.0f; static const float k2 = kv * 5.0f; У меня получалось, что функция kv вычислялась в компилтайме, а kx в реале. С const float все идет как надо. Спасибо за наводку =). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 1 февраля, 2020 Опубликовано 1 февраля, 2020 · Жалоба Кстати, может быть дело было в том, что функции не объявлены static. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 2 1 февраля, 2020 Опубликовано 1 февраля, 2020 · Жалоба Пробовал constexpr static const k0() {...}; Не помогало Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 1 февраля, 2020 Опубликовано 1 февраля, 2020 · Жалоба А если поднять до c++17? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 1 февраля, 2020 Опубликовано 1 февраля, 2020 · Жалоба А вот так? constexpr float foo() { constexpr float x = 3.3f/4096.0f; return x; } Вообще, оптимизатор без всяких constexpr должен такие функции оптимизировать до константы. -О3 или -Оs стоит? PS: Ждём C++20, там будет consteval, который гарантирует вычисление в компайлтайме. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 2 2 февраля, 2020 Опубликовано 2 февраля, 2020 · Жалоба 12 hours ago, AHTOXA said: А если поднять до c++17? Он и был установлен. 12 hours ago, VladislavS said: -О3 или -Оs стоит? Оптимизация отключена. Как раз kv() возвращала значение сразу, а k0, k1, k2, которые умножали kv на константу считались в rt. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 2 февраля, 2020 Опубликовано 2 февраля, 2020 · Жалоба 2 минуты назад, RadiatoR сказал: Оптимизация отключена. Пацаны, расходимся, нас наипали :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 2 2 февраля, 2020 Опубликовано 2 февраля, 2020 · Жалоба Just now, VladislavS said: нас наипали :( А каким образом constexpr и оптимизация связаны? Разве она "мешает" компилятору? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 2 февраля, 2020 Опубликовано 2 февраля, 2020 · Жалоба Только что, RadiatoR сказал: Разве она "мешает" компилятору? Кто компилятору, пардон, мешает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 2 2 февраля, 2020 Опубликовано 2 февраля, 2020 · Жалоба я про 7 minutes ago, VladislavS said: Пацаны, расходимся, нас наипали :( Ответ же был про оптимизацию. Что с ней не так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 2 февраля, 2020 Опубликовано 2 февраля, 2020 · Жалоба С ней не так, что она должна быть включена, чтобы компилятор оптимизировал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 2 2 февраля, 2020 Опубликовано 2 февраля, 2020 · Жалоба Пускай сейчас она отключена и он не оптимизирует. Почему constexpr без нее не должен работать? PS. Подтверждаю - с O3 старый код заработал "правильно". Не знал такой особенности Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться