| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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. Спасибо. |