Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Большие константы |
Автор: HMLd 29.6.2006, 01:24 | ||||
При объявлении константы типа
и объявлении массива
программа компилируется нормально, но при выполнении виснет. При отладке по шагам выдаёт ошибку на первой же строке программы. Фишка в том, что если задать значение данной константы равное 4 294 967 295 - т.е. максимальное значение long - всё работает на ура...Теряюсь в догадках. Компилятор - Borland c++ 5.02 (При использование const всё так же). Может - борландовский глюк? |
Автор: ptr 29.6.2006, 07:35 |
Если sizeof(int)=4, то получается где-то, 15 Гбайт памяти. Компилятор должен выдать ошибку, что размер массива слишком большой. Да и у тебя, кроме того, будет stack overflow. |
Автор: chich 29.6.2006, 07:40 |
может у него оперативки много ![]() и вообще для выделения больших массивов (но не таких как этот) помоему лучше пользоваться new и delete |
Автор: MAKCim 29.6.2006, 09:01 | ||||
на 32-ой архитектуре виртуальное адресное пространство составляет обычно 4Gb (физической памяти итого меньше) а ты хочешь выделить ~ 15Gb, да еще и в стеке, не круто ли? ![]() |
Автор: HMLd 29.6.2006, 12:07 | ||
Точно....Всё, спасибо. Разобрался... ![]() |
Автор: Rockie 29.6.2006, 12:21 | ||
..получилось? |
Автор: Xenon 29.6.2006, 12:41 |
... И почему макрос обозвали константой? |
Автор: DeadSoul 29.6.2006, 21:55 |
Это почему? |
Автор: 586 29.6.2006, 22:17 |
Потому что локальные переменные хранятся в стеке. |
Автор: 586 29.6.2006, 22:35 |
И от этого бывает. Ведь под эти переменные создается фрейм в стеке. |
Автор: HMLd 30.6.2006, 00:29 | ||||||||
Мне кажется, что в данном контексте строки
и
идентичны. Разве нет?...
фрейм - ![]() |
Автор: Xenon 30.6.2006, 00:33 |
HMLd Константа хранится в памяти и даже тип имеет, а макрос - автозамена данного выражение на другое во время компиляции. |
Автор: HMLd 30.6.2006, 02:19 | ||
Это ясно, и я это не оспариваю, просто в вышеприведённом коде работа и смысл программы не изменится, если вместо const писать #define. В другом контексте это может и играть роль... ![]() |
Автор: 586 30.6.2006, 02:31 | ||||
Фрейм - это выделенный участок памяти в стеке. Вот пример:
Диззасемблированный код:
|
Автор: MAKCim 30.6.2006, 09:26 | ||
В C++ Страуструп рекомендует писать const, а не макросы. Да и вообще в большинстве случаев от них лучше совсем отказаться (не имею в виду #include, #ifndef #define #endif в связке) |
Автор: Xenon 30.6.2006, 11:26 |
HMLd, Просто дело даже не в контексте, а в ... ну правильности речи что ли ![]() А в С++ рекомендуется от макросов отказаться, так как появился const ![]() |
Автор: HMLd 30.6.2006, 13:37 | ||
Понял, буду становится грамотным и культурным. Теперь только const. Спасибо. ![]() |