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

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

09.12.2017, 21:13. Показов 2885. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru