| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Как создать очень большой массив? |
| Автор: Wolf1994 21.3.2009, 10:52 | ||||
| Какого максимального размера можно создавать массивы в C++? Создание, например, такого массива:
не вызывает ошибок при компиляции, но приводит к: http://www.wolf-ware.ru/graphics/posts/wc_error.gif Максимальный размер массива, при котором программа работает без ошибок:
Как обойти это ограничение? |
| Автор: andrew_121 21.3.2009, 11:09 |
| Wolf1994, А про функции выделения слышали? malloc() - это С функция. new - это С++ оператор. |
| Автор: GoldFinch 21.3.2009, 14:36 |
| глобальные - практически любого размера локальные - небольшого, чтобы в стек влезли Добавлено через 1 минуту и 31 секунду new - не лучший вариант для больших массивов, может не влезть в хип и вообще хип не для такого |
| Автор: zim22 21.3.2009, 14:57 |
что вы тогда посоветуете вместо new использовать? WinAPI не предлагать. |
| Автор: JackYF 21.3.2009, 15:23 | ||
Это, простите, чушь. |
| Автор: GoldFinch 21.3.2009, 15:23 |
| zim22, когда бы выделяете область памяти небольшого размера средствами языка, это выделение незначительно в масштабах системы, поэтому язык может это осуществить исключительно своими средствами Когда вы выделяете кусок памяти размером сопоставимым с ограничениями конкретной системы, то язык нормально такой кусок памяти уже выделит. В ряде случаев помогут специфичные для системы настройки компилятора (увеличение размера хипа\стека по умолчанию), но это плохое решение, т.к. не всегда нужен большой хип и\или стек. Поэтому надо юзать системные функции, для выделения своего хипа и\или изменения стека конкретного потока. Но использование хипа или стека для длительного хранения небольшого числа данных большого размера, например 2-3 массива по 250Мб, это не есть хорошо, потому что хип особенно полезен для частого выделения\освобождения небольших кусков памяти разной длины, а стек вообще не для этого. Поэтому надо юзать системные функции для выделения кусков памяти под отдельные большие структуры данных Вобщем без использования системных функций, можно - использовать глобальный массив, т.е. сразу зарезервировать место в образе файла - увеличить размер хипа в десятки раз, но это не гарантирует что вследствие его фрагментации в нем всегда будет место под большой кусок памяти. Например сделали хип 500Мб, выделили 250Мб, выделили 1б, удалили 250Мб, выделили 1б, теперь 250Мб уже не выделить. |
| Автор: Lazin 21.3.2009, 15:24 | ||
пардон, а чем-же тогда? |
| Автор: GoldFinch 21.3.2009, 15:27 |
| для справки в win32 процессу отведено менее 2Гб памяти, вследствие ее фрагментации нет гарантии что там окажется непрерывный кусок хотябы в 1Гб, размер зарезервированного хипа по умолчанию - 100Мб |
| Автор: andrew_121 21.3.2009, 15:29 |
| Похоже кто-то вчера праздновал по полной ))) Добавлено через 4 минуты и 22 секунды Ну так это про фрагментацию. Память, ваще имеет свойство фрагментироваться. Думаю это не для кого не секрет. |
| Автор: GoldFinch 21.3.2009, 15:48 |
| andrew_121, ты посты целиком читаешь, или выборочно про 5 слов? у меня и было написано "вследствие ее фрагментации нет гарантии ..." зачем повторять то что я уже написал? |
| Автор: zim22 21.3.2009, 15:50 | ||
| четыреста миллионов элементов int. полтора гига оперативки сожрали. чем new не устраивает, не понимаю...
|
| Автор: andrew_121 21.3.2009, 16:06 |
Солидарен. |
| Автор: GoldFinch 21.3.2009, 16:25 |
| действительно через new память выделяется, причем совсем не так как я себе представлял, кусками в разных местах памяти |
| Автор: Rififi 21.3.2009, 17:24 |
| Как создать очень большой массив? решение состоит из двух этапов: 1. купить много-много гигабайтов оперативной памяти 2. перейти на 64-битную платформу |
| Автор: mes 21.3.2009, 17:32 |
так человеко требуется всего шесть с половиной мегабайт, а Вы его нагружаете много много гигабайтной ОЗУ. |
| Автор: andrew_121 21.3.2009, 18:19 | ||
Просто выглядит страшно |
| Автор: Dem_max 21.3.2009, 18:36 |
| new и точка. |
| Автор: Dmi3ev 21.3.2009, 18:37 | ||
и того меньше... GoldFinch, откуда у вас такие сведения??? Поделитесь... |
| Автор: Wolf1994 22.3.2009, 15:43 | ||||
Не удалось создать массив для char по аналогии:
привело к:
Но вариант с глобальным массивом сработал. Спасибо за помощь. |
| Автор: zim22 22.3.2009, 16:04 | ||
двумерный динамический массив создаётся несколько по другому. например массив 10 на 10 так:
|
| Автор: Dmi3ev 22.3.2009, 16:08 | ||
zim22, я бы написал вот так
так правильнее! Добавлено через 2 минуты и 3 секунды твой вариант не скомпилируется скорее всего... |
| Автор: zim22 22.3.2009, 16:15 | ||
ещё как компилится! В моём коде необходимо инкрементить указатель. чтобы он заработал гениально правильно!
|
| Автор: Dmi3ev 22.3.2009, 16:20 | ||
вот это уже ближе к правде, все равно считаю мой вариант классическим и более правильным... |
| Автор: zim22 22.3.2009, 16:33 | ||
Dmi3ev, мне в вашем коде всё нравится, кроме того, что вы в двух строчках делаете то, что я бы сделал в одной
|
| Автор: Dmi3ev 22.3.2009, 16:40 | ||||
это уже дело другое... я про запись говорил... а так я написал для того, чтобы товарищ понял, что необязательно объявлять и тут же выделять память, а можно будет объявить:
а потом уже выделять... |