![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| EKoshelev |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 509 Регистрация: 1.9.2004 Репутация: нет Всего: нет |
Написал вот такую функию:
Программа компилируется и запускается. Когда начинает исполняться приведённая функция вылетает ошибка: "Unhandled exception at 0x7c812afb in ProjectName.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0012bb84" на самой первой строке с созданием массива. Пишу в восьмой студии. Если в обоих случаях сделать на один ноль меньше, то всё отрабатывает. Ну и вопрос остаётся прежним: "Можно ли таки создать массив длиной 1.000.000.000 байт?". П. С. Понятно, что мою задачу в принципе можно решить и без такого длинного массива. Интересно принципиально возможно ли такое. Дельфа, например, создаёт такой массив без проблем. -------------------- Вежливым и адекватным предлагаю общаться на "ты". |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
EKoshelev, все зависит от платформы и системы, на которой работает программа. В частности, 32-х битная платформа позволяет оперировать чуть более чем 4 млрд байтами.
Я не знаю, почему твоя программа падает. Возможно, необходимо что-то в настройках изменить. |
|||
|
||||
| SenkraD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 3.2.2006 Где: Украина::Киев Репутация: 2 Всего: 23 |
А это все что вы выделяете в программе? Если не ошибаюсь (давно не обновлял для себя инфу), то под процесс выделяется базово 4Gb, с которых ситстемма сразу скушает гиг под свои нужны, потом часть памяти зарезервируется и юзеру(программеру) будет доступно 2Gb, понятно что обьем доступной памяти можно увеличить, но базово было так.
у меня на VS2010 на Win XP SP3:
P.S. Еще есть такая опция Это сообщение отредактировал(а) SenkraD - 31.7.2013, 11:20 |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Зависит от фрагментации виртуального адресного пространства программы. У меня недавно был трабл, что не мог даже 512Мб выделить одним куском. Dll-ка пакостная влезла посередине адресов и разбила самый большой кусок адресов пополам. В принципе я бы рекомендовал переселяться на 64 бита если нужны длинные массивы. Есть прожка VMMap она позволит посмотреть, кто у вас в проге главный диверсант, который разбил большой кусок адресов.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| EKoshelev |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 509 Регистрация: 1.9.2004 Репутация: нет Всего: нет |
SenkraD, с хипом попробовал похимичить - ничего не вышло.
Alexeis, Ага. Пробовал 10 массивов по 100.000.000 создавать - получается. А один на млн. - фиг. -------------------- Вежливым и адекватным предлагаю общаться на "ты". |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
EKoshelev, можно перед запуском дефрагментатор памяти запустить. были у меня когда-то такие маленькие утилитки (правда не пользовался, нужды не было), в сети их должно быть. возможно даже с исходниками, поищите. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
volatile, а смысл? Системе пофиг на фрагментацию памяти, она может непрерывный блок памяти организовать хоть из ста физических блоков оперативы + еще 100 кусков свопа. Скорее всего после такого new система и не освободит гиг памяти, а будет добавлять страницы оперативы по мере появления ошибок доступа к памяти. Другое дело если в системе своп+озу в сумме не будет свободного гига. Тогда, вероятно, пойдет уже отказ по причине нехватки памяти.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Не всегда. Там есть ограничения, напр. минимальный переместимый блок, и много другой всякой мути... ... Выше пример, наглядное тому подтверждение. память же есть, а непрерывный кусок создать не может. пусть EKoshelev, попробует, возможно поможет. Впрочем, утврждать что точно поможет не берусь. Это сообщение отредактировал(а) volatile - 31.7.2013, 13:39 |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
volatile, есть предположение, что не поможет, т.к.
Получается, что это CRT студии не может выделить, а не ОС. 2 ТС: я выделял 18 ГБ без проблем. Естественно, на 64-х битной ОС (правда не windows) -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Вы думаете CRT выделяет память каким-то волшебным способом, минуя ОС?
|
|||
|
||||
| EgoBrain |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: нет Всего: 2 |
В довесок к словам Alexeis о фрагментации вирт. памяти
Миф №3 Ну и про архитектуру памяти статья. То есть получается, большие куски могут быть разбиты доп. данными и командами. Вопрос в том, как с этим бороться.. |
|||
|
||||
| volatile |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
У меня выделяет. (2008 студия)
Это в дебаге! В релизе так вообще до 2000 мб доходит, но я сомневаюсь что там не соптимизировалось, уж очень быстро печатает. В дебаге каждая строчка (особенно последние) занимает ощутимое время, то есть происходит реальное выделение памяти. Система XP 32 разр., на борту 3 гига оперативы. Запущена студия, опера, IE, и еще куча всяких мелочей. Напомню 2 гига - теоретический предел для 32 разрядных. (можно теоретический предел увелить до 3 гб, но это надо капаться в настройкх системы.) Цель вышеописанного теста была выяснить этот вопрос. но повторить проблему пока не удалось |
||||
|
|||||
| DarthTon |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 106 Регистрация: 7.2.2009 Репутация: нет Всего: 6 |
Как уже сказал Alexeis, всё зависит от фрагментации адресного пространства процесса. Если в нём будет свободный блок нужного размера - массив будет создан.
Просто Вам повезло. Например, благодаря ASLR, образы модулей, база кучи и область стека потоков разместились в адресном пространстве так, что осталось место для массива.
Основное замедление при выделении из хипа в дебаг версии занимает забивание выделенной памяти дебажной CRT сигнатурой. В придачу выделяются дополнительные байты перед и после каждого блока для детекта Heap Undelfow и Overflow(становится заметно при большом количестве мелких выделений).
Использовать х64. |
||||||
|
|||||||
| akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
Взял ваш код, откомпилил под VS 2010 32х разрядная XP и запустил, всё работает нормально. Указывайте либо характеристики вашего компьютера (память), либо опции компиляции проекта. Или тогда считайте, что вы сервиспак какой-то не поставили, или, что одно и то же, это какие-то родимые пятна вашего экземпляра компилятора Это сообщение отредактировал(а) akizelokro - 5.8.2013, 06:40 -------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
| EgoBrain |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: нет Всего: 2 |
А что, на платформе x64 виртаульная память по-другому распределяется с избежанием фрагментации? Имеется ввиду как бороться с фрагментацией.. Это сообщение отредактировал(а) EgoBrain - 5.8.2013, 08:22 |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |