Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как создать очень большой массив? 
V
    Опции темы
Wolf1994
Дата 21.3.2009, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 5.10.2004

Репутация: нет
Всего: 29



Какого максимального размера можно создавать массивы в C++?

Создание, например, такого массива:
Код

char dm3 [100000] [64];

не вызывает ошибок при компиляции, но приводит к:
http://www.wolf-ware.ru/graphics/posts/wc_error.gif

Максимальный размер массива, при котором программа работает без ошибок:
Код

char dm3 [20000] [64];


Как обойти это ограничение?
PM MAIL WWW   Вверх
andrew_121
Дата 21.3.2009, 11:09 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Wolf1994, А про функции выделения слышали?
malloc() - это С функция.
new - это С++ оператор.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
GoldFinch
Дата 21.3.2009, 14:36 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



глобальные - практически любого размера
локальные  - небольшого, чтобы в стек влезли

Добавлено через 1 минуту и 31 секунду
new - не лучший вариант для больших массивов, может не влезть в хип и вообще хип не для такого
PM MAIL ICQ   Вверх
zim22
Дата 21.3.2009, 14:57 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(GoldFinch @  21.3.2009,  14:36 Найти цитируемый пост)
new - не лучший вариант для больших массивов

что вы тогда посоветуете вместо new использовать? WinAPI не предлагать.


--------------------
PM MAIL   Вверх
JackYF
Дата 21.3.2009, 15:23 (ссылка)  | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 6
Всего: 162



Цитата(GoldFinch @  21.3.2009,  13:36 Найти цитируемый пост)
new - не лучший вариант для больших массивов, может не влезть в хип и вообще хип не для такого 

Это, простите, чушь.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
GoldFinch
Дата 21.3.2009, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



zim22, когда бы выделяете область памяти небольшого размера средствами языка, это выделение незначительно в масштабах системы, поэтому язык может это осуществить исключительно своими средствами
Когда вы выделяете кусок памяти размером сопоставимым с ограничениями конкретной системы, то язык нормально такой кусок памяти уже выделит. 
В ряде случаев помогут специфичные для системы настройки компилятора (увеличение размера хипа\стека по умолчанию), но это плохое решение, т.к. не всегда нужен большой хип и\или стек.
Поэтому надо юзать системные функции, для выделения своего хипа и\или изменения стека конкретного потока.
Но использование хипа или стека для длительного хранения небольшого числа данных большого размера, например 2-3 массива по 250Мб, это не есть хорошо, потому что хип особенно полезен для частого выделения\освобождения небольших кусков памяти разной длины, а стек вообще не для этого.
Поэтому надо юзать системные функции для выделения кусков памяти под отдельные большие структуры данных

Вобщем без использования системных функций, можно
- использовать глобальный массив, т.е. сразу зарезервировать место в образе файла
- увеличить размер хипа в десятки раз, но это не гарантирует что вследствие его фрагментации в нем всегда будет место под большой кусок памяти. Например сделали хип 500Мб, выделили 250Мб, выделили 1б, удалили 250Мб, выделили 1б, теперь 250Мб уже не выделить.
PM MAIL ICQ   Вверх
Lazin
Дата 21.3.2009, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



Цитата(GoldFinch @  21.3.2009,  14:36 Найти цитируемый пост)
new - не лучший вариант для больших массивов, может не влезть в хип и вообще хип не для такого

пардон, а чем-же тогда? smile 
PM MAIL Skype GTalk   Вверх
GoldFinch
Дата 21.3.2009, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



для справки
в win32 процессу отведено менее 2Гб памяти, вследствие ее фрагментации нет гарантии что там окажется непрерывный кусок хотябы в 1Гб,
размер зарезервированного хипа по умолчанию - 100Мб
PM MAIL ICQ   Вверх
andrew_121
Дата 21.3.2009, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Похоже кто-то вчера праздновал по полной )))

Добавлено через 4 минуты и 22 секунды
Цитата(GoldFinch @  21.3.2009,  15:27 Найти цитируемый пост)
нет гарантии что там окажется непрерывный кусок хотябы в 1Гб

Ну так это про фрагментацию. Память, ваще имеет свойство фрагментироваться. Думаю это не для кого не секрет.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
GoldFinch
Дата 21.3.2009, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



andrew_121, ты посты целиком читаешь, или выборочно про 5 слов?
у меня и было написано "вследствие ее фрагментации нет гарантии ..."
зачем повторять то что я уже написал?
PM MAIL ICQ   Вверх
zim22
Дата 21.3.2009, 15:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



четыреста миллионов элементов int.
полтора гига оперативки сожрали.
чем new не устраивает, не понимаю...
Код

int *p = new int [400000000];
delete p;



--------------------
PM MAIL   Вверх
andrew_121
Дата 21.3.2009, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(zim22 @  21.3.2009,  15:50 Найти цитируемый пост)
чем new не устраивает, не понимаю...

Солидарен.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
GoldFinch
Дата 21.3.2009, 16:25 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



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


PM MAIL ICQ   Вверх
Rififi
Дата 21.3.2009, 17:24 (ссылка)  | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 3
Всего: 36



Как создать очень большой массив?
решение состоит из двух этапов:
1. купить много-много гигабайтов оперативной памяти
2. перейти на 64-битную платформу
PM MAIL   Вверх
mes
Дата 21.3.2009, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Rififi @  21.3.2009,  16:24 Найти цитируемый пост)
1. купить много-много гигабайтов оперативной памяти


Цитата(Wolf1994 @  21.3.2009,  09:52 Найти цитируемый пост)
char dm3 [100000] [64];

так человеко требуется всего шесть с половиной мегабайт, а Вы его нагружаете много много гигабайтной ОЗУ.
 smile 

Это сообщение отредактировал(а) mes - 21.3.2009, 17:33


--------------------
PM MAIL WWW   Вверх
andrew_121
Дата 21.3.2009, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(mes @  21.3.2009,  17:32 Найти цитируемый пост)
так человеко требуется всего шесть с половиной мегабайт, а Вы его нагружаете много много гигабайтной ОЗУ.

Просто выглядит страшно smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Dem_max
Дата 21.3.2009, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



new и точка.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Dmi3ev
Дата 21.3.2009, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



Цитата

так человеко требуется всего шесть с половиной мегабайт, а Вы его нагружаете много много гигабайтной ОЗУ.

и того меньше... 

GoldFinch, откуда у вас такие сведения??? Поделитесь...


--------------------

PM MAIL   Вверх
Wolf1994
Дата 22.3.2009, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 5.10.2004

Репутация: нет
Всего: 29



Цитата(zim22 @  21.3.2009,  15:50 Найти цитируемый пост)
int *p = new int [400000000];

Не удалось создать массив для char по аналогии:
Код

char *p = new char [100000] [64];

привело к:
Цитата

1000 c:\wc\wc.cpp cannot convert `char (*)[64]' to `char*' in initialization 

Но вариант с глобальным массивом сработал. Спасибо за помощь.
PM MAIL WWW   Вверх
zim22
Дата 22.3.2009, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Wolf1994 @  22.3.2009,  15:43 Найти цитируемый пост)
Не удалось создать массив для char по аналогии:

двумерный динамический массив создаётся несколько по другому. например массив 10 на 10 так:
Код
char **p = new char *[10]();
    for (int i = 0; i != 10; ++i)
        *p = new char[10]();




--------------------
PM MAIL   Вверх
Dmi3ev
Дата 22.3.2009, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



zim22, я бы написал вот так
Код

int n=100000;//количество строк
int m=64;//количество столбцов
int **p; 
p= new int *[m];
    for (int i = 0; i <m; i++)
        p[i] = new int[n];

так правильнее!

Добавлено через 2 минуты и 3 секунды
твой вариант не скомпилируется скорее всего...

Это сообщение отредактировал(а) Dmi3ev - 22.3.2009, 16:08


--------------------

PM MAIL   Вверх
zim22
Дата 22.3.2009, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Dmi3ev @  22.3.2009,  16:08 Найти цитируемый пост)
твой вариант не скомпилируется скорее всего...

ещё как компилится!

В моём коде необходимо инкрементить указатель. чтобы он заработал гениально правильно! smile
Код

*p++ = new char[10]();


Это сообщение отредактировал(а) zim22 - 22.3.2009, 16:15


--------------------
PM MAIL   Вверх
Dmi3ev
Дата 22.3.2009, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



Цитата

В моём коде необходимо инкрементить указатель.

вот это уже ближе к правде, все равно считаю мой вариант классическим и более правильным...


--------------------

PM MAIL   Вверх
zim22
Дата 22.3.2009, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Dmi3ev, мне в вашем коде всё нравится, кроме того, что вы в двух строчках делаете то, что я бы сделал в одной smile
Код

int **p; 
p= new int *[m];



--------------------
PM MAIL   Вверх
Dmi3ev
Дата 22.3.2009, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



Цитата

Dmi3ev, мне в вашем коде всё нравится, кроме того, что вы в двух строчках делаете то, что я бы сделал в одной 

это уже дело другое...
я про запись говорил...
а так я написал для того, чтобы товарищ понял, что необязательно объявлять и тут же выделять память, а можно будет объявить:
Код

int i, g, **p, *m;

а потом уже выделять...


--------------------

PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0788 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.