Перейти к содержанию
    

Всем привет.

Заметил в проекте, что в коде:

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?

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 часов назад, RadiatoR сказал:

Подскажите, может что-то не включил или не правильно понимаю работу constexpr?

Проверьте наличие ключа компилятора -std=c++17.

А подстраховаться можно, объявив constexpr переменную, и присвоив ей результат вызова функции:

static constexpr kv_ = kv();

В этом случае компилятор сразу заругается, если не сможет вычислить kv() в процессе компиляции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 все идет как надо.

Спасибо за наводку =).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вот так?

constexpr float foo()
{
  constexpr float x = 3.3f/4096.0f;
  return x;
}

Вообще, оптимизатор без всяких constexpr должен такие функции оптимизировать до константы. -О3 или -Оs стоит?

 

PS: Ждём C++20, там будет consteval, который гарантирует вычисление в компайлтайме. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 hours ago, AHTOXA said:

А если поднять до c++17?

Он и был установлен.

12 hours ago, VladislavS said:

-О3 или -Оs стоит?

Оптимизация отключена.

Как раз kv() возвращала значение сразу, а k0, k1, k2, которые умножали kv на константу считались в rt.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, RadiatoR сказал:

Оптимизация отключена.

Пацаны, расходимся, нас наипали :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Just now, VladislavS said:

нас наипали :(

А каким образом constexpr и оптимизация связаны? Разве она "мешает" компилятору?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, RadiatoR сказал:

Разве она "мешает" компилятору?

Кто компилятору, пардон, мешает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я про

7 minutes ago, VladislavS said:

Пацаны, расходимся, нас наипали :(

Ответ же был про оптимизацию. Что с ней не так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С ней не так, что она должна быть включена, чтобы компилятор оптимизировал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пускай сейчас она отключена и он не оптимизирует. Почему constexpr без нее не должен работать?

PS. Подтверждаю - с O3 старый код заработал "правильно". Не знал такой особенности

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...