| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 | ||
к сожалению, ничего вразумительного:
и фффсё. больше ни одной строчки. ни одного символа... насколько я знаю, на стеке и в 1000 раз меньше нельзя выделить. В вопросе было |
| Автор: Randajad 1.7.2012, 13:16 |
| А в куче выделить память нельзя? |
| Автор: borisbn 1.7.2012, 13:52 |
В принципе можно, но я бы хотел на этапе компиляции/линковки знать, что память будет выделена. Не хотелось бы узнать о нехватке памяти в рантайме... Предлагаю объединить темы - эту и соседнюю - http://forum.vingrad.ru/forum/topic-353866/anchor-entry2501627/0.html Причём объединить там (в "Правомерно ли такое"), а эту тему забросить |
| Автор: volatile 1.7.2012, 13:56 | ||
Боюсь что это невозможно в обоих случаях. |
| Автор: borisbn 1.7.2012, 14:33 |
Я, пожалуй, неправильно высказался... Я НЕ хочу в своей программе проверять, выделилась ли память после new. Я хочу, чтобы стандартный загрузчик без моего участия либо выделил память и дал бы моей программе работать, либо сам бы ругнулся на недостаток памяти |
| Автор: 500mhz 1.7.2012, 19:21 |
| Ну все правильно что линковщик отшил, вы же хотите получить память как неинициализированную (ну типа секция .bss хотя название может быть другим), и эта фигня при загрузке файла будет пытатся выделится в адресном пространстве процеса, выделяйте ручками и будет вам счастье ) |
| Автор: 500mhz 1.7.2012, 19:46 | ||
ниче там не распухнет, массив будет определен как НЕИНИЦИАЛИЗИРОВАНЫЙ и занимать в файле будет 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 | ||
Честно говоря, не знаю (с линуксами не дружу). Вот, что выдаёт df
Причём, я работаю в каталоге /home/user (т.е. каталог с проектом находится там), но работаю из-под root'а. Если мне доступно только /dev/sdg2, тогда понятно, что тупо не хватает места, если же /dev/sdg3 - то места, как видите, достаточно |
| Автор: 500mhz 2.7.2012, 17:04 |
| Я понял в чем проблема ))) В заголовке ELF размер секции 4 байтами определяется (при 32битном ельфе) так что туда 12гб по определению не влезут ))) |
| Автор: borisbn 2.7.2012, 17:20 | ||
хммм. но у меня 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 |
во всяком случае программа линкуется без ошибок... правда, не запускается: у меня временно забрали 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=medium всё заработало.
выводит
|