Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826

Использование constexpr vs const

25.02.2020, 00:39. Показов 1990. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер,

есть 2 кода:
Первый:
C++
1
2
constexpr float FIXED_FPS = 45.0f;
constexpr float FIXED_DT = 1.0f / FIXED_FPS;
Второй:
C++
1
2
const float FIXED_FPS = 45.0f;
const float FIXED_DT = 1.0f / FIXED_FPS;
по моим ощущениям:
а) при компиляции Release сборки с оптимизацией на выходе будет один и тот же код - значение FIXED_FPS и FIXED_DT подставятся в место использования, переменные не будут созданы, если их адрес никто не умудрился запросить.
б) во втором случаи значение "переменной" FIXED_DT будет вычислена на момент компиляции и/или в рантайме, но время на рефакторинг этого места не стоит свеч.
в) учитывая пункт выше: использование constexpr в таком простом кейсе избыточно и не привычно глазу(тут отсылка к использованию технологий не к месту). Как по мне у constexpr семантика более глубокая, чем применять/переписывать все месте, где до С++11 хватало и const.

Вопрос: как бы написали эти 2 строки и почему?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.02.2020, 00:39
Ответы с готовыми решениями:

В чем разница между const и constexpr?
Когда стоит применять constexpr? В чём его отличие от const? Если можно конкретные примеры в их различиях. Например, constexpr int m =...

Как компилятор обрабатывает член класса static constexpr const char*
Привет! Наткнулся на непонятный момент class Foo { public: static constexpr const char* PTR = "value"; }; ...

int const * const foo(const int* param) const - разъясните значение квалификаторов
int const * const foo(const int* param) const -----1------2----------3----------------4 1: ? 2: делает содержимое массива или...

11
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.02.2020, 00:47
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
как бы написали эти 2 строки и почему?
Code
1
2
3
4
if compile time evaluation are needed
    constexpr
else
    const
2
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
25.02.2020, 00:55  [ТС]
Вот еще к аргументам листинг кода:
const https://godbolt.org/z/7NDPYG
constexpr https://godbolt.org/z/vopWsC
они одинаковые на выходе
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
25.02.2020, 01:02
rikimaru2013, по идее, они и должны быть одинаковые в данном контексте.
Но, const-объекты могут быть инициализированы и в рантайме динамически, тогда как объекты constexpr - это либо время компиляции, либо ошибка.
2
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
25.02.2020, 01:11  [ТС]
Croessmah, поэтому я хочу понять природу моего внутреннего недовольства, когда "пихают" constexpr в места, где хватило бы и привычного const.

Да возможно это "придырки", но одна из таких придирок запечатлена в https://github.com/isocpp/CppC... ependently и думаю многих с ней согласятся.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
25.02.2020, 01:19
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
природу моего внутреннего недовольства
Вы недовольны, а я предпочитаю constexpr.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
25.02.2020, 01:22  [ТС]
Croessmah, так подскажите ваши доводы в сторону constexpr. Думаю вам не раз приходилось писать const до С++11. И тут приходит день, и вы начинаете писать по другому в тех же случаях - подскажите почему?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
25.02.2020, 01:39
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
И тут приходит день, и вы начинаете писать по другому в тех же случаях - подскажите почему?
Потому что это позволяет писать однообразно не только для int'ов:
C++
1
2
3
4
5
6
7
8
9
struct Some
{
    int value;
};
 
//...
constexpr Some x1{10}; //x1.value - константа времени компиляции
constexpr int x2{10};  //мешать const и constexpr в зависимости от типа?
const Some x3{10};     //x3.value - не константа времени компиляции
Ну и из постулата выше:
C++
1
2
3
4
5
6
template<typename T>
void foo()
{
    constexpr T v1{0};//константа времени компиляции
    const T v2{0};//ХЗ что это
}
2
 Аватар для mvngr
225 / 189 / 98
Регистрация: 15.04.2018
Сообщений: 718
25.02.2020, 01:57
rikimaru2013, а посмотреть чуть поглубже? Это немного из разных миров, для меня const - как ограничение для программистов и облегчение жизни компилятору, а constexpr - это полные вычисления до этапа запуска (а-ля чтобы клиент миллионы раз не считал условное число пи, если ваш компилятор не соблаговолит собрать ваш продукт с нормальной оптимизацией const double pi = 22 / 7 к чему-то вроде const double pi = 3.14........, ибо компиляторы не идеальны, и могут скинуть всё на рантайм). Так же не стоит забывать про -O0 оптимизацию, в таком варианте const имеет явные отличия от constexpr

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Foo{
public:
constexpr Foo(int i, double j) : i_(i), j_(j) {}
constexpr double doSomethingInCompileTime() { return i * j; }
private:
constexpr int i;
constexpr double j;
};
 
void main()
{
    constexpr Foo contexprValue(5, 33.15);
    constexpr resultConstExpr = constexprValue.doSomethingInCompileTime();
    //До этого момента код будет полностью выполнен во время компиляции. А теперь попробуйте вызвать у constexpr переменной не constexpr метод
    return;
}
*Поправьте меня, я тему с constexpr не сильно разгрёб

Добавлено через 4 минуты
Я не так давно хотел решить одну задачу. Суть заключается в том, чтобы на этапе компиляции выявлять несоответствия количества аргументов и работать с std::get<std::size_t N>(std::tuple) не по цифрам, а по строкам.
Сам код:
https://github.com/mvngr/ForTe... r/main.cpp

Надеюсь, что-нибудь будет понятно. Если очень захотите комментарии - пишите

Добавлено через 3 минуты
Croessmah, жаль, что только в последних стандартах появляются намеки на constexpr StringView и другие "базовые" типы языка, которыми мы пользуемся повседневно. Поэтому писать свои constexpr классы до 17 стандарта (по моему мнению) дикость и чистой воды боль.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
25.02.2020, 09:47
rikimaru2013, написал бы через constexpr, потому что этот тот же const только более строгий, что как я считаю отлично. Какраз подходит под всякие глобальные переменные. Ну и вы ничего не теряете, в рантайме constexpr будет превращён в обычный const.
2
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
25.02.2020, 09:55
Лучший ответ Сообщение было отмечено rikimaru2013 как решение

Решение

А, ну и Скотт Мейерс, Современный и эффективный С++
Правило 15: «используйте constexpr везде где это возможно».
Миниатюры
Использование constexpr vs const  
2
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
25.02.2020, 09:57
mvngr, ваш пример вообще о другом.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.02.2020, 09:57
Помогаю со студенческими работами здесь

Присваивание constexpr к non-constexpr
constexpr float pi = 3.14159265; void some_fun() { float angle = 45.0f*(pi/180.0f); std::cout &lt;&lt; angle; } В консоли...

Использование ключевого слова const
как понимать такое: const int a; // понятно это константа с именем - а int const a; // ? непонятно что это const int const a; // ?...

char operator[](unsigned short offset) const; // что означает const?
Собстенно вопрос уже озвучен :).

Что это bool operator== (const CLASS&) const;
Что это? class CLASS { public: bool operator== (const CLASS&amp;) const; ...

Const в параметрах. Перед чем нужно употребить const дабы обезопасить данные от изменения
const int Counter(const TSNum *Start) { int c=0; while(Start!=NULL){Start=Start-&gt;next;} return c; } Функция...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru