Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
27 / 27 / 16
Регистрация: 22.08.2017
Сообщений: 126

Размещение констант в классе

09.12.2017, 21:13. Показов 3051. Ответов 29
Метки нет (Все метки)

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

Есть код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    
 
    class a {
 
        const int const1 = 100;
        const int const2 = 100;
 
    public:
 
        int get1() { return const1; }
        int get2() { return const2; }
 
    };
Вопрос:

1. Будет ли в каждом экземпляре класса "a" лежать две константы? Или транслятор поймет, что это константы и не будет их располагать в каждом экземпляре класса?

Спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.12.2017, 21:13
Ответы с готовыми решениями:

Размещение констант(теорет.)
По вашему мнению, где лучше размещать константы 1) Все константы в одном файла(массив или класс не имеет значения) 2) Необходимые...

Правильное размещение констант
Перед тем как создавать тему, погуглил, но нигде ответа не нашел. Вопрос такой: Есть набор констант, которые могут использоваться в...

Размещение констант во flash-памяти AVR?
Уважаемые коллеги! Осваиваю графический экранчик, написал для него в отдельном .h шрифт в виде: #include <avr/pgmsposi.h> ...

29
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.12.2017, 20:30
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Renji Посмотреть сообщение
Если ваш компилятор не в состоянии заинлайнить константу времени компиляции, выкиньте его на помойку.
вычисления значений времени компиляции ортогональны
расходу памяти под статические объекты.

если ваш компилятор в состоянии вычислить значение выражения,
это не значит, что константа не скушает память.

C++
1
2
3
4
5
6
7
// линкуемся с уже откомпилированной библиотекой sample_library.lib
#include "sample_library.h" 
...
 
const auto& value = sample::constant; //<--- lvalue bind
 
foo(&value); //<--- uppps
если при сборке библиотеки sample_library.lib
ваш компилятор оптимизировал
константу времени компиляции sample::constant
выбросьте его на помойку.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
10.12.2017, 22:04
Цитата Сообщение от hoggy Посмотреть сообщение
если при сборке библиотеки sample_library.lib
ваш компилятор оптимизировал
константу времени компиляции sample::constant
выбросьте его на помойку.
Пример из серии "глянцевый журнал опустим в дистиллированную воду, а дешевый в серную кислоту".
Да, все верно, если вы создадите ссылку на constexpr константу, компилятор потребует объявить ее в cpp файле и константа скушает память. Вот только взять ссылку на enum константу вы вообще не можете. Так что причем тут это?
Если же ссылок не создавать, то constexpr константа будет прекрасно себя чувствовать даже в хедер-онли библиотеке, у которой никаких lib отродясь не было. И с чего бы ей там кушать память - загадка.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.12.2017, 22:30
Цитата Сообщение от Renji Посмотреть сообщение
Да, все верно, если вы создадите ссылку на constexpr константу, компилятор потребует объявить ее в cpp файле и константа скушает память.
нет. не потребует.
интегральные константы объявленные в хедерах не нуждаются
в дополнительных объявлениях в спп файлах.

Цитата Сообщение от Renji Посмотреть сообщение
Вот только взять ссылку на enum константу вы вообще не можете. Так что причем тут это?
то, чего быть не должно - не должно быть в принципе.
енум - идеальная альтернатива дефайнам.

статические объекты-константы - оверкилл.
костыли.

Цитата Сообщение от Renji Посмотреть сообщение
Если же ссылок не создавать, то constexpr константа будет прекрасно себя чувствовать даже в хедер-онли библиотеке, у которой никаких lib отродясь не было. И с чего бы ей там кушать память - загадка.
если не хвататься руками за оголенные провода,
током не ударит.

см №16
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
10.12.2017, 22:38
Цитата Сообщение от hoggy Посмотреть сообщение
нет. не потребует.
интегральные константы объявленные в хедерах не нуждаются
в дополнительных объявлениях в спп файлах.
g++ 6.3.0
C++
1
2
3
4
5
6
7
8
9
10
11
struct Test
{
    static constexpr int x=0;
};
 
//constexpr int Test::x;//если это в комментариях
int main()
{
    auto&test=Test::x;///то ошибка: undefined reference to `Test::x'
    return 0;
}
Повторюсь, с enum константой такое вообще не заведется.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.12.2017, 22:51
Цитата Сообщение от Renji Посмотреть сообщение
Повторюсь, с enum константой такое вообще не заведется.
бред какой то:
http://rextester.com/PCYG6541

Code
1
2
3
source_file.cpp: In function ‘int main()’:
source_file.cpp:9:10: warning: unused variable ‘test’ [-Wunused-variable]
     auto&test=Test::x;///то ошибка: undefined reference to `Test::x'
енумы тем и хороши,
что не пропускают подобный бред.

Цитата Сообщение от hoggy Посмотреть сообщение
то, чего быть не должно - не должно быть в принципе.
енум - идеальная альтернатива дефайнам.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
10.12.2017, 23:17
Цитата Сообщение от hoggy Посмотреть сообщение
бред какой то:
http://rextester.com/PCYG6541
Это не бред, это на сайте используется ключ оптимизации -O2. Если он задан, то все прокатывает. Если его убрать и вбить просто gcc main.cpp -Wall -std=c++11 то компиляция падает.
Цитата Сообщение от hoggy Посмотреть сообщение
енумы тем и хороши,
что не пропускают подобный бред.
Что так, что сяк, получается ошибка компиляции.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
10.12.2017, 23:31
На очереди double через enum, stay tuned!
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.12.2017, 07:48
Цитата Сообщение от Renji Посмотреть сообщение
Это не бред, это на сайте используется ключ оптимизации -O2. Если он задан, то все прокатывает. Если его убрать и вбить просто gcc main.cpp -Wall -std=c++11 то компиляция падает.
поведение, которое зависит от ключей компилятора - не просто бред.
а бред эпичный.

Цитата Сообщение от Renji Посмотреть сообщение
Что так, что сяк, получается ошибка компиляции.
как интересно люди иногда противоречат самим себе,
и объективной реальности)

см #26
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
11.12.2017, 07:54
Цитата Сообщение от hoggy Посмотреть сообщение
поведение, которое зависит от ключей компилятора - не просто бред.
а бред эпичный.
Сам удивлен, но все претензии к авторам gcc. Перепроверил на 4.9.2 - ровно та же фигня. Видимо, с -O2 компилятор эту строчку с auto& просто выкидывает.
Цитата Сообщение от hoggy Посмотреть сообщение
как интересно люди иногда противоречат самим себе,
Я тестирую в дебаг-сборке, в которой -O2 нет.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.12.2017, 08:11
Цитата Сообщение от Renji Посмотреть сообщение
Сам удивлен, но все претензии к авторам gcc.
я ж писал уже выше: технология "передовая"
она ещё не обкатана.
и вообще, императив в компалтайме это - амбиционзная,
и чрезвычайно сложная технология.
с кучей ограничений и багов.

не нужно юзать сложное и передовое только потому что оно - передовое.
когда можно поиметь такой же профит,
используя простые и проверенные временем решения.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.12.2017, 08:11

Массив констант в статическом классе. Как правильно сделать
Добрый день! Есть задача, сделать класс с данными, в котором хранится простой массив с данными и классы, содержащие массивы константных...

Доля отличников в классе больше 2/5, но меньше 3/7, а всего в классе не более 15 учеников. Сколько всего в классе учеников?
Добрый вечер! Подскажите, пожалуйста! &quot;Доля отличников в классе больше 2/5, но меньше 3/7, а всего в классе не более 15 учеников....

Как использовать объект класса, созданого в определеном классе, в другом классе
У меня такой вопрос,как использовать объект класса,созданого в определеном классе,в другом классе.У меня есть объект pl класса Player,это...

В классе инициализировать массив, в классе создать функцию вывода массива на экран
Прошу помоши с выводом данных, которые содержаться в массиве, на экраy: Задача: В классе инициализировать массив, в классе создать...

Как обьявить переменную в одном классе и что бы ее было видно в дочернем классе
У меня есть основной класс с названием Root один из его членов наследует дочерний класс SubRoot. Скажите как объявить, что бы один из...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru