Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Константы |
Автор: JAnty 28.3.2005, 13:04 |
Мне очень интересно, зачем константы которые занимают память, если есть макросы? |
Автор: En_t_end 28.3.2005, 13:11 |
Тут недавно в подобной же теме все уже обьяснили, макросы тоже занимают память, глянь страницой 1-2 назад. Добавлено @ 13:21 http://forum.vingrad.ru/index.php?showtopic=44313 |
Автор: chipset 28.3.2005, 13:29 | ||
Память все равно занимают. Но кроме того, они не типизированы и их использование ведёт к ошибкам. |
Автор: Alastis 28.3.2005, 13:50 |
Да, в больших проектах большое кол-во дефайнов чревато... хотя иногда это помогает сделать код красивым и понятным... для себя![]() |
Автор: DENNN 28.3.2005, 15:37 |
Голосование составленно по дурацки. Использование const и #define нужно не противопоставлять друг-другу, а использовать совместно так, как это для проекта удобнее. |
Автор: pablo 28.3.2005, 16:57 |
Ребята давайте подумаем логически. Если можно было бы обойтись без констант, только макросами, так зачем же их ввели ? Ответ прост. Потому что макросы встраиваются в код препроцессором, повышают вероятность ошибок который очень тяжело находить. |
Автор: S.A.P. 28.3.2005, 17:25 | ||||
Не вижу смысла использовать const. Добавлено @ 17:27
#define OUR_FLOAT (float)86,236 Добавлено @ 17:28 Современные компиляторы достаточно хорошо оптимизируют дефайны, и тот топ тому подтверждение. Добавлено @ 17:29
|
Автор: Олег М 28.3.2005, 18:01 | ||
А счего ты взял, что они занимают память? Это тоже самое, что и макросы, только для них, в отличие от макроса определён тип, а это хорошо. Вообще в современном с++ можно спокойно обойтись без макросов, для того всё и делается. Вообще с точки зрения призводительности и памяти отличий макросов от констант и инлайноских функций нет. А вот в с точки зрения хорошего и безопасного кода макросы уже давно не канают. |
Автор: S.A.P. 28.3.2005, 18:12 | ||
|
Автор: Олег М 28.3.2005, 18:21 | ||
В том что это не переменная, ни функция, простая глупая подстановка текста, которая не имеет ни типа, ни нормальных параметров. Макросы вообще плохо вписываются в парадигмы языков программирования. Кстати, кто-нибудь может привести пример, на С++, более выгодного использования макросов в сравнении с константами и инлайновскими функциями? |
Автор: JAnty 28.3.2005, 18:43 | ||
А почему во всех Header файах используют макросы?
Да ещо как занимают.(помню чото в книге писалось про яейки памяти и Read Only). - A что хорошего в сonst "определён тип"? - Только путоница. ![]() |
Автор: chipset 28.3.2005, 21:13 | ||||
Хм. Представьте вполне легальное обьявление:
Теперь на секунду представьте, что какой-то крутой праграмер, написал:
![]() |
Автор: S.A.P. 28.3.2005, 22:42 |
Если сравнивать константные объявления #define и const, то основное различие в том, что дефайн должен быть уникальным во всей программе, т.к. не чувствителен к пространствам имен. const в этом плане гораздо гибче, но иногда удобнее воспользоваться дефайном. Ну а сравнивать дефайн и inline функции ИМХО глупо. 2 совершенно разные вещи. |
Автор: chipset 28.3.2005, 22:47 | ||
Пример в студию! |
Автор: S.A.P. 29.3.2005, 08:00 | ||
|
Автор: chipset 29.3.2005, 08:11 | ||
Так тогда наоборот, у вас есть возможность определить собственную константу с таким-же именем, если я правильно понял. ... Дело в том, что С++, как язык поддерживающий ООП в довольно-таки полной мере, применяет все vtnjls чтобы заставить людей мыслить обьектно-ориентированно. К примеру, существуют такие вещи как модификаторы private, public, protected; namespace'ы, защищенное наследование и т.д.. Это всё сделано, чтобы граммотный разработчик имел возможность контроллировать области видимости и реализовывать инкапсуляцию, при которой обьект представляет собой черный ящик. Будет весьма прикольно если какой то static обьект, предназначенный для namespace'а A, за непонятным хреном влезет в мой неймспейс B что случается при использовании абсолютно неконтроллируемого, пережитка Сишного прошлого - #define. Невозможно никакое граммотное разделение кода на модули и классы при введении вышеупомянутого анахронизма. Это вполне применимо при маленьких проектах, тыща-две строк, но при отладке реальных программ это становится настоящей пыткой, и я был рад что в C# эта хренотень исчезла. |
Автор: S.A.P. 29.3.2005, 08:26 | ||||||||
простой пример
2 константы: одна объявлена через define, вторая через const, обе не задействованы в программе. Смотрим ассемблерный код
как видишь компилятор пропустил define, а const остался в памяти. А теперь представь, что было бы, если все стандртные костантные значения (например WM_TIMER) были бы определены в через const.
![]() |
Автор: chipset 29.3.2005, 08:41 | ||
Когда я добавил ещё одну константу но не заюзал её, код не изменился. |
Автор: Олег М 29.3.2005, 08:54 | ||||
А как ты компилил и на чём?
![]() |
Автор: S.A.P. 29.3.2005, 13:08 | ||||||||||
А попробуй - ка сделать ее не глобальной.
и посмотри дизасмом. Память по любому будет выделяться. Юзаешь ты ее или нет. Дефайн я в любом месте объявлю и он будет глобальный и память выделяться не будет, если я его не использую. Дело вкуса. ![]() и наконец твой код. Попробуй вместо const int j = 10; записать const double j = 10; ![]()
Добавлено @ 13:18 Олег М есть еще одно применение #define. Из WINDOWSX
юзаем
Удобно? Как такое инлайновыми функциями сделать? Что не говорите, но #define жил, живет и будет жить. Во всяком случае в C++. |
Автор: DENNN 29.3.2005, 13:47 | ||
А никто и не спорит ![]() |
Автор: Олег М 29.3.2005, 14:20 | ||||||
![]()
Покажи, что у тебя в дизасме получается (есть подозрение, что ты в дебаге компилишь). Лично у меня вот что
Где тут подо что память выделяется? непонятно |