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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Из однонаправленного списка сделать двунаправленный список http://www.cyberforum.ru/cpp/thread1808296.html
понимаю, что мне нужен указатель на предыдущий элемент. но что с ним делать, и что делать в главной программе, не понимаю, помогите, пожалуйста #include <iostream> #include <fstream> #include <string> #include <conio.h> using namespace std; // Структура — элемент списка struct node { string surname;
C++ Преобразовать заданные строки, согласно условию (сортировка и сравнение строк, вставка/удаление символов) Даны строки A и B. Если все символы A входят в B и в B есть повторяющиеся символы, то упорядочить символы B в порядке, обратном к алфавитному, удалив повторяющиеся символы, и удалить русские буквы из A; в остальных случаях удалить из A символы, не входящие в B, и продублировать цифры в B. Помогите очень прошу) последняя лаба из долгов по сессии((( http://www.cyberforum.ru/cpp/thread1807743.html
C++ Получить график дат санитарных дней в указанном году
задача: Городской рынок имеет санитарный день каждый понедельник месяца . Дано номер года и указано день недели , на который приходится 1 января. Получить график дат санитарных дней в указанном году. Помогите пожалуйста решить задачу
C++ Распознование животных на изображении
Стала интересна тема распознавания образов на изображениях. Программа должна получать картинку с животным и определить какое это животное(как я понимаю, задача не простая, но все же) . Подскажите в какую сторону копать, какие есть статьи/книги/сайты посвященные этой теме. Слышал про OpenCV, но я уверен, что есть еще что-то похожее.
C++ Как число типа 2.88007e+018 привести в обычный int, float или просто вывести http://www.cyberforum.ru/cpp/thread1807404.html
Тестирующая система говорит "Неправильный формат вывода". Программа считает числа фиббоначи, по формуле Бине (дается только n, найти значение). #include <iostream> #include <math.h> using namespace std; int main() { int n; cin >> n;
C++ Как подружить компьютер c МК через USB Здравствуйте, уважаемые форумчане! Никогда не работал с USB нужна помощь. Есть компьютер под управлением Windows 7, плата разработки DE0-Nano-SoC. Необходимо написать программу для ОС, которая могла бы определять плату как USB устройство. В DE0-Nano-SoC есть два USb-интерфейса UART to USB (COM-порт) и USB OTG (FT232R). Думаю подключать через USB OTG. Пишу как в Microsoft Visual Stidio... подробнее

Показать сообщение отдельно
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
3061 / 1545 / 419
Регистрация: 18.10.2014
Сообщений: 2,865
20.09.2016, 06:14     Как компилятор обрабатывает член класса static constexpr const char*
Цитата Сообщение от 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.
 
Текущее время: 07:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru