Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > GNU toolchain > Максимальный размер static-массива


Автор: borisbn 10.6.2012, 11:48
Здравствуйте.

Недавно потребовалось создать статический массив размером 12.884.901.888 байт (8192*64*48*8*8*sizeof(long long))
Компилятор (вернее линковщик) меня отшил с такими претензиями, однако на борту имеется 16 ГБ памяти, ОС - 64-х разрядная OpenSuse 11.3 x86_64. Версию gcc не помню (он там встроенный) то точно выше 4.5.

Вопрос: такой объём памяти вообще можно выделить ? Если да, то как ?
Спасибо.

Автор: kuzulis 10.6.2012, 14:57
Мож компилятору нужно какие-нить ключики дать, чтобы он не матюкался, а увеличил размер стека скок нужно?

Автор: boostcoder 10.6.2012, 15:19
неплохо бы узнать, что сказал линкер,

Автор: borisbn 10.6.2012, 15:45
Цитата(boostcoder @  10.6.2012,  15:19 Найти цитируемый пост)
неплохо бы узнать, что сказал линкер,

к сожалению, ничего вразумительного:
Цитата
error: ld returned 1 exit status

и фффсё. больше ни одной строчки. ни одного символа...

Цитата(kuzulis @  10.6.2012,  14:57 Найти цитируемый пост)
увеличил размер стека скок нужно?

насколько я знаю, на стеке и в 1000 раз меньше нельзя выделить. В вопросе было 
Цитата(borisbn @  10.6.2012,  11:48 Найти цитируемый пост)
потребовалось создать статический массив


Автор: Randajad 1.7.2012, 13:16
А в куче выделить память нельзя?

Автор: borisbn 1.7.2012, 13:52
Цитата(Randajad @  1.7.2012,  13:16 Найти цитируемый пост)
А в куче выделить память нельзя? 

В принципе можно, но я бы хотел на этапе компиляции/линковки знать, что память будет выделена. Не хотелось бы узнать о нехватке памяти в рантайме...
Предлагаю объединить темы - эту и соседнюю - http://forum.vingrad.ru/forum/topic-353866/anchor-entry2501627/0.html
Причём объединить там (в "Правомерно ли такое"), а эту тему забросить

Автор: volatile 1.7.2012, 13:56
Цитата(borisbn @  1.7.2012,  13:52 Найти цитируемый пост)
я бы хотел на этапе компиляции/линковки знать, что память будет выделена

Боюсь что это невозможно в обоих случаях.

Автор: borisbn 1.7.2012, 14:33
Цитата(volatile @  1.7.2012,  13:56 Найти цитируемый пост)
Боюсь что это невозможно в обоих случаях.

Я, пожалуй, неправильно высказался... Я НЕ хочу в своей программе проверять, выделилась ли память после new. Я хочу, чтобы стандартный загрузчик без моего участия либо выделил память и дал бы моей программе работать, либо сам бы ругнулся на недостаток памяти

Автор: 500mhz 1.7.2012, 19:21
Ну все правильно что линковщик отшил, вы же хотите получить память как неинициализированную (ну типа секция .bss хотя название может быть другим), и эта фигня при загрузке файла будет пытатся выделится в адресном пространстве процеса, выделяйте ручками и будет вам счастье )

Автор: mes 1.7.2012, 19:25
Цитата(borisbn @  10.6.2012,  14:45 Найти цитируемый пост)
насколько я знаю, на стеке и в 1000 раз меньше нельзя выделить. В вопросе было 
потребовалось создать статический массив

интересно, а то что программа распухнет минимум на величину вашего массива Вас не смущает ? :winк

Автор: 500mhz 1.7.2012, 19:46
Цитата

интересно, а то что программа распухнет минимум на величину вашего массива Вас не смущает ? :winк



ниче там не распухнет, массив будет определен как НЕИНИЦИАЛИЗИРОВАНЫЙ и занимать в файле будет 0 байт, а вот при загрузке займет все что было указано.

Автор: math64 2.7.2012, 10:53
У меня 32-разрядная ubuntu, gcc 4.4.5, про массив такого объема сразу выдаёт sizeof array too large. Максимум даёт выделить 2GB (что естестственно для 32-разрядной ОС), но компилируется очень долго. Размер откомпилированного файла - 7K. 

Автор: math64 2.7.2012, 11:27
компилируется на самом деле быстро, долго линкуется. Наверно, создаёт временный файл размером 2GB (в случае borisbn -12GB), а потом обрезает до 7K.
borisbn, у Вас есть столько свободного места?

Автор: borisbn 2.7.2012, 16:24
Цитата(math64 @  2.7.2012,  11:27 Найти цитируемый пост)
у Вас есть столько свободного места? 

Честно говоря, не знаю (с линуксами не дружу). Вот, что выдаёт df

Цитата
linux-dkgu:/ # df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sdg2              20G  8.8G   10G  47% /
devtmpfs              1.6G  492K  1.6G   1% /dev
tmpfs                 1.6G   16K  1.6G   1% /dev/shm
/dev/sdg3             896G  7.7G  843G   1% /home

Причём, я работаю в каталоге /home/user (т.е. каталог с проектом находится там), но работаю из-под root'а. Если мне доступно только /dev/sdg2, тогда понятно, что тупо не хватает места, если же /dev/sdg3 - то места, как видите, достаточно

Автор: 500mhz 2.7.2012, 17:04
Я понял в чем проблема )))
В заголовке ELF размер секции 4 байтами определяется (при 32битном ельфе) так что туда 12гб по определению не влезут )))

Автор: borisbn 2.7.2012, 17:20
Цитата(500mhz @  2.7.2012,  17:04 Найти цитируемый пост)
Я понял в чем проблема )))
В заголовке ELF размер секции 4 байтами определяется (при 32битном ельфе) так что туда 12гб по определению не влезут )))

хммм. но у меня 64-х битный линукс. Такой же g++ (я это выяснил путём вывода sizeof( void* ) = 8)
Но вообще-то, очень похоже, т.к. как только я уменьшил размер массива ровно до 4 ГБ - всё стало собираться.
А как тогда сказать g++, чтобы эльф стал 64-х битным ?

Автор: math64 3.7.2012, 07:31
borisbn,  а как у Вас со временем линковки? 
Временные файлы создаются по умолчанию в /var/tmp/ - т.е. в Вашем случае на /dev/sdg2/, но можно переназначить сделав /var/tmp/ символической ссылкой на каталог в /dev/sdg3/ (права доступа должны соответствовать)
Попробуйте создать массив 6GB - если получится (места для него у Вас точно хватит), то заголовок ELF не при чём

Автор: borisbn 3.7.2012, 09:54
Ура!!! Решил.
для gcc нужен ключ -fpic -mcmodel=large
Нашёл тут - http://stackoverflow.com/questions/6296837/gcc-compile-error-with-2-gb-of-code
вот этот ответ - http://stackoverflow.com/a/6297704/667266

Автор: 500mhz 3.7.2012, 10:10
И? 12 гб выделяется?

Автор: borisbn 3.7.2012, 10:14
Цитата(500mhz @  3.7.2012,  10:10 Найти цитируемый пост)
12 гб выделяется? 

во всяком случае программа линкуется без ошибок...
правда, не запускается: у меня временно забрали 16 ГБ... есть только 4... как только вернут - проверю и отпишусь

Автор: borisbn 3.7.2012, 13:33
Блин.... То понос, то золотуха... Теперь у меня линукс не видит больше 4 гигов памяти...
Но это - отдельная тема. Кстати, господа линуксоиды, я её создал - http://forum.vingrad.ru/forum/act-ST/f-135/t-353944/unread-1.html - посмотрите, если не сложно. Спасибо.

Автор: borisbn 27.7.2012, 17:00
P.S. оказывается 
Цитата
-mcmodel=large
Generate code for the large model: This model makes no assumptions about addresses and sizes of sections. Currently GCC does not implement this model.

но, используя -mcmodel=medium всё заработало. 
Код
printf( "size = %d MB\n", sizeof( large_array ) / 1024 / 1024 );

выводит
Цитата
size = 12240  MB

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