Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Большие константы


Автор: HMLd 29.6.2006, 01:24
При объявлении константы типа 
Код
 #define MAX 4000000000

и объявлении массива 
Код

int tmp[MAX]
for (unsigned long i = 0; i < MAX; i++)
tmp[i] = 0;

программа компилируется нормально, но при выполнении виснет. При отладке по шагам выдаёт ошибку на первой же строке программы. Фишка в том, что если задать значение данной константы равное 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
может у него оперативки много  smile 
и вообще для выделения больших массивов (но не таких как этот) помоему лучше пользоваться new и delete 

Автор: MAKCim 29.6.2006, 09:01
Цитата

#define MAX 4000000000

Цитата

int tmp[MAX];

на 32-ой архитектуре виртуальное адресное пространство составляет обычно 4Gb (физической памяти итого меньше)
а ты хочешь выделить ~ 15Gb, да еще и в стеке, не круто ли?  smile  

Автор: HMLd 29.6.2006, 12:07
Цитата
лучше пользоваться new и delete

Точно....Всё, спасибо. Разобрался...smile 

Автор: Rockie 29.6.2006, 12:21
Цитата(HMLd @  29.6.2006,  12:07 Найти цитируемый пост)
Цитата    
лучше пользоваться new и delete    

Точно....Всё, спасибо. Разобрался... 

..получилось? 

Автор: Xenon 29.6.2006, 12:41
...
И почему макрос обозвали константой? 

Автор: DeadSoul 29.6.2006, 21:55
Цитата(ptr @  29.6.2006,  07:35 Найти цитируемый пост)
Да и у тебя, кроме того, будет stack overflow.  

Это почему? 

Автор: 586 29.6.2006, 22:17
Цитата(DeadSoul @  29.6.2006,  22:55 Найти цитируемый пост)
Цитата(ptr @  29.6.2006,  07:35 Найти цитируемый пост)
Да и у тебя, кроме того, будет stack overflow.  

Это почему?  

Потому что локальные переменные хранятся в стеке. 

Автор: DeadSoul 29.6.2006, 22:24
Цитата(586 @  29.6.2006,  22:17 Найти цитируемый пост)
Цитата(DeadSoul @  29.6.2006,  22:55 )
Цитата(ptr @  29.6.2006,  07:35 )
Да и у тебя, кроме того, будет stack overflow.  
Это почему?  
Потому что локальные переменные хранятся в стеке.  

Переполнение стека обычно бывает от другого
 

Автор: 586 29.6.2006, 22:35
Цитата(DeadSoul @  29.6.2006,  23:24 Найти цитируемый пост)
Переполнение стека обычно бывает от другого

И от этого бывает. Ведь под эти переменные создается фрейм в стеке. 

Автор: HMLd 30.6.2006, 00:29
Цитата
И почему макрос обозвали константой? 

Мне кажется, что в данном контексте строки 
Код

#define MAX 12345
int array[MAX];

и
Код

const int MAX 12345;
int array[MAX];

идентичны.
Разве нет?...

Цитата

Ведь под эти переменные создается фрейм в стеке. 

фрейм - smile 

Автор: Xenon 30.6.2006, 00:33
HMLd Константа хранится в памяти и даже тип имеет, а макрос - автозамена данного выражение на другое во время компиляции.     

Автор: HMLd 30.6.2006, 02:19
Цитата
Константа хранится в памяти и даже тип имеет, а макрос - автозамена данного выражение на другое во время компиляции.

Это ясно, и я это не оспариваю, просто в вышеприведённом коде работа и смысл программы не изменится, если вместо const писать #define.
В другом контексте это может и играть роль... smile 

Автор: 586 30.6.2006, 02:31
Цитата(HMLd @  30.6.2006,  01:29 Найти цитируемый пост)
фрейм -   smile 

Фрейм - это выделенный участок памяти в стеке.
Вот пример:
Код
void test()
{
 int i[2];
 i[0]=1;
 i[1]=i[0];
}

Диззасемблированный код:
Код
00401000 55               push    ebp        // int i[2]; // создание фрейма - выделение памяти в стеке
00401001 8bec             mov     ebp,esp    // ^^
00401003 83ec08           sub     esp,0x8    // ^^ // sizeof(int[2])=0x8;
00401006 c745f801000000   mov     dword ptr [ebp-0x8],0x1   // int[0]=1;  // работа с переменной
0040100d 8b45f8           mov     eax,[ebp-0x8]            // i[1]=i[0];
00401010 8945fc           mov     [ebp-0x4],eax            // i[1]=i[0];
00401015 8be5             mov     esp,ebp    // удаление фрейма
00401017 5d               pop     ebp        // ^^
00401018 c3               ret
  

Автор: MAKCim 30.6.2006, 09:26
Цитата

Это ясно, и я это не оспариваю, просто в вышеприведённом коде работа и смысл программы не изменится, если вместо const писать #define.
В другом контексте это может и играть роль...

В C++ Страуструп рекомендует писать const, а не макросы. Да и вообще в большинстве случаев от них лучше совсем отказаться (не имею в виду #include, #ifndef #define #endif в связке) 

Автор: Xenon 30.6.2006, 11:26
HMLd, Просто дело даже не в контексте, а в ... ну правильности речи что ли smile Культуре, во!
А в С++ рекомендуется от макросов отказаться, так как появился const smile 

Автор: HMLd 30.6.2006, 13:37
Цитата
Просто дело даже не в контексте, а в ... ну правильности речи что ли smile Культуре, во!
А в С++ рекомендуется от макросов отказаться, так как появился const smile 

Понял, буду становится грамотным и культурным. Теперь только const. Спасибо. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)