Форум программистов, компьютерный форум, киберфорум
Наши страницы

Как компилятор обрабатывает член класса static constexpr const char* - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Распознование животных на изображении http://www.cyberforum.ru/cpp/thread1807414.html
Стала интересна тема распознавания образов на изображениях. Программа должна получать картинку с животным и определить какое это животное(как я понимаю, задача не простая, но все же) . Подскажите в...
C++ Как подружить компьютер c МК через USB Здравствуйте, уважаемые форумчане! Никогда не работал с USB нужна помощь. Есть компьютер под управлением Windows 7, плата разработки DE0-Nano-SoC. Необходимо написать программу для ОС, которая... http://www.cyberforum.ru/cpp/thread1807335.html
C++ Различия между Java и Си++
Я раньше программировал на си++,сейчас начал на java,нужно понять основные различия 1. Каковы отличия в структуре программы вычисления простого арифметического выражения на языке Си и Си++ от...
C++ Отображение файла формата .fbx
Здравствуйте,здесь мы будем мучать openGL, fbx sdk, ImageMagick, assimp. В двух словах, как я думаю, у меня проблема с UV координатами. Мне необходимо сделать программу для отображения .fbx...
C++ Можно ли сдавать ОГЭ по информатике (последнее задание) на C++? http://www.cyberforum.ru/cpp/thread1804926.html
Можно ли сдавать ОГЭ по информатике (последнее задание) на C++? Там нужно будет писать на компе в блокноте, в консоле или ручкой на листике? Можно ли подключать заголовочники (iostream, cstdio,...
C++ Шаблоны функци в классе Создал следующий шаблон функции: #include <iostream> using namespace std; template<int N> int fibonacci(){ return fibonacci<N-1>() + fibonacci<N-2>(); } template<> int fibonacci<1>(){... подробнее

Показать сообщение отдельно
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3945 / 2169 / 553
Регистрация: 18.10.2014
Сообщений: 3,783
20.09.2016, 06:14
Цитата Сообщение от Kastaneda Посмотреть сообщение
Вопрос - как компилятора без линкера разруливает это дело, ведь constexpr value ему нужен на этапе компиляции? Если он это пережевывает, почему тогда constexpr необходим?
Концепция адресной константы была еще в языке С с самого начала стандартизованных времен. Про этом язык С никогда не поддерживал динамической инициализации для объектов со статическим storage duration. Т.е. при старте программы на C все объекты со статическим storage duration должны "родиться" уже проинициализированными, в том числе такие как

C
1
2
static int i;
static int *pi = &i;
Понятно, что значение pi не может быть известным на стадии компиляции. Более того, это значение даже в те времена в Unix не обязательно было известно даже на стадии линковки, а могло оказаться известным только на стадии загрузки (например, для глобальных объектов, определенных в shared objects). То есть конкретное значение адресной константы в общем случае может быть даже не линкером, а только загрузчиком в момент начала выполнения.

По этой причине спецификация адресных констант в С была специально подогнана под возможности загрузчиков. А именно, в С адресные константы выступают как константы только в инициализаторах и только либо сами собой, либо с прибавлением к адресной константе (или вычитанием из нее) какого-то смещения, известного на стадии компиляции (что разрешает в т.ч. применение операторов [] и -> в комбинации с & для формирования новых адресных констант). Другими словами, адресные константы в С могут быть использованы как константы только для целей относительной адресации.

То есть в рамках спецификации, нельзя написать

C
1
static int array[(size_t) pi % 100];
ибо, понятое дело, это требует знания точного значения (size_t) pi на стадии компиляции.

Так вот спецификация constexpr в С++ совсем не далеко уходит от этих ограничений, пришедших в С++ из С. Фактически, все, чего вы добиваетесь указанием constexpr в этом объявлении указателя, это превращение в constexpr таких выражений, как PTR[5]. Для этого инициализатор PTR должен быть виден компилятору, т.е. присутствовать в объявлении. Ясно, что для определения значения PTR[5] в таком случае компилятору совсем не нужно знать конкретного значения PTR.

Любые же попытки "выковырять" из PTR его численное значение на стадии компиляции (или как-то еще завязаться на абсолютную точку в памяти, куда он указывает) обречены на провал, даже несмотря на то, что PTR объявлен как constexpr.
7
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru