|
5 / 5 / 2
Регистрация: 12.10.2011
Сообщений: 75
|
||||||
Выделите-ка под массив память размером 32 ГБ11.07.2013, 22:45. Показов 7702. Ответов 40
Метки нет (Все метки)
Получил ряд вопросов от одной фирмы. Надо ответить чтобы удостоить себя собесодованием) Вот один из них.
Словесно представьте вашу последовательность действий при написании программного кода заданий описанных ниже с учетом всех возможных на Ваш взгляд багов: а) Приведите любой пример выделения памяти под массив, где размер выделяемой памяти должен составлять = 235 байт и заполните его случайными значениями. б) Переэлокейтите массив, чтобы его размерность увеличилась с 235 до 235 + 100. Про а)
Изначально я понимал, что выделить такой большой кусок памяти тривиальными средствами не получится. Но я просто не знаю какими средствами можно решить поставленную задачу.
0
|
||||||
| 11.07.2013, 22:45 | |
|
Ответы с готовыми решениями:
40
Не выделяется память под массив
|
|
|
|
| 12.07.2013, 11:24 | |
|
Где-то на форуме уже писал про это - на 64 битной ОС добиться std::bad_alloc еще постараться надо. Дело в том, что оператор new() работает с виртуальными адресами, и ничего не мешает выделить, например, 1 ТБ (это под Linux, в винде есть ограничение памяти на процесс, вроде 17 гигов, но точно не помню). Если выделить 10 ТБ, то никакого std::bad_alloc не будет, все пройдет хорошо. Проблемы начнутся при записи/чтении в/из этой памяти. Потому обертывать new в try{}catch(){} на 64 битной ОС по сути бесполезное занятие.
1
|
|
|
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|||||||
| 12.07.2013, 14:45 | |||||||
0
|
|||||||
|
5 / 0 / 0
Регистрация: 06.07.2013
Сообщений: 59
|
|
| 12.07.2013, 15:05 | |
|
Многовато))) 32 гб)
0
|
|
|
|
||||||
| 12.07.2013, 15:09 | ||||||
|
alsav22, я ж написал, что в винде ограничение на каждый процесс есть. Вот на 64 битном Linux'е запустил такой код
0
|
||||||
| 12.07.2013, 17:42 | |
|
0
|
|
|
|
||||||||||||
| 12.07.2013, 17:53 | ||||||||||||
|
У меня нет 64 битной винды, проверить доступный размер не могу, но, если кому не сложно, можно выполнить следующий код и выложить результат.
0
|
||||||||||||
|
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
| 12.07.2013, 18:03 | |
|
Это при 4Гб памяти.
0
|
|
|
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
| 12.07.2013, 18:28 | |
|
Но не болше же чем физической памяти?
0
|
|
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||
| 12.07.2013, 19:22 | ||
|
Kastaneda, Данный код подвесил мою систему наглухо... bad_alloc не дождался... Вообщем, жесть)
В release после 3 ГБ вышел bad_alloc, 4 ГБ в системе. http://stackoverflow.com/quest... -a-program
0
|
||
|
|
||||
| 12.07.2013, 19:35 | ||||
|
Добавлено через 3 минуты Добавлено через 2 минуты
0
|
||||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
| 12.07.2013, 19:38 | |
|
Kastaneda, 1 или 2. Но это был дебаг. В релизе все крайне быстро
0
|
|
| 12.07.2013, 19:42 | |
|
Не по теме: За что люблю линукс, так это за то, что когда что-то не понятно, можно взять и посмотреть в исходниках как оно реально работает. А когда в винде что-то непонятно, нужно искать ответ на msdn, если там не нашел, то гуглить, если не нагуглил, то спросить на форуме, если на форуме не помогут, то ответа на свой вопрос ты так и не узнаешь (если конечно нет желания погрузиться на несколько месяцев в дизассемблер:)).
0
|
|
|
150 / 137 / 35
Регистрация: 29.07.2012
Сообщений: 709
|
|
| 12.07.2013, 19:57 | |
|
Я пока еще не опытен в C++, но по-моему можно же сделать так.
К сожалению, я не знаю сколько памяти занимает тип int (2 по-моему). Допустим вам надо выделить 256 кб, ну и примерно так int *a = new int[128]; //Если я в чем-то не прав, разьясните пожалуйста в чем..
0
|
|
|
|
||||||||
| 12.07.2013, 21:36 | ||||||||
0
|
||||||||
| 12.07.2013, 21:39 | |
|
0
|
|
| 13.07.2013, 02:41 | |
|
0
|
|
|
5 / 5 / 2
Регистрация: 12.10.2011
Сообщений: 75
|
||||||
| 13.07.2013, 03:18 [ТС] | ||||||
|
Ребята, вы ушли в сторону от задачи.
Итак malloc/new 32 ГБ никак не выделят. Вдобавок size_t просто урежет значение переменной размера. Я пробовал использовать функции VirtualAlloc и VirtualFree, которые являются более гибкими средствами выделения памяти.
Конфигурация проекта Win32. Память выделилась (с предупреждением об усечении значения переменной размера) размером в 4096, что вполне ожидаемо, ведь VirtualAlloc память выделяет блоками по 4096 байт, и соответственно указанный размер будет округляться до этого числа. Конфигурация проекта x64. VirtualAlloc возвращает нулевой указатель, что говорит о неудачном выделении. Зато успешно выделялась и заполнялась случайными значениями память объемом 2 ГБ, 3 ГБ. При 5 ГБ вся моя оперативная память была занята и система зависла. Есть еще такой механизм свопинга, заключающийся в том, что каждый процесс полностью переносится в память, работает некоторое время и потом целиком возвращается на диск. Другая стратегия – виртуальная память – позволяет программам работать даже тогда, когда они частично находятся в оперативной памяти. Система использует механизм виртуализации адресов при необходимости, но почему-то на мое приложение механизм не распространяется, когда объем выделяемой памяти превышает объем свободной оперативной памяти.
0
|
||||||
|
Ушел с форума
|
|||||
| 13.07.2013, 10:06 | |||||
|
массив, а в том, чтобы предложить хорошую абстракцию для работы с таким массивом. Например, можно написать что-то вроде класса large_array, который будет хранить свое содержимое на диске, в 32-гигабайтном файле, и предоставлять клиентам доступ к нужным элементам, загружая их в память по мере необходимости. На Windows наиболее естественным для этого будет использовать отображаемые в память файлы. Сверху можно навесить кэш, в котором хранить некоторое количество последних элементов, запрошенных клиентами, для ускорения доступа (чтобы не дергать диск каждый раз). Но в любом случае это получится "дырявая" абстракция: с таким массивом нельзя будет работать также, как с обычным - доступ к памяти нужно будет делать косвенный, например, через дескрипторы, не будет безопасным выполнять memset на диапазоне элементов такого массива, и т.п. В каталоге страниц памяти 32-битного процесса просто нет столько места, чтобы хранить описание массива в 32 гигабайта. Пользовательским процессам в 32-битном адресном пространстве доступно чуть меньше 2 гигабайт, ключ /3GB принципиально картины не меняет. О непрерывном блоке памяти такого размера в 32-битном процессе можно забыть. Кстати, вместо увеличения файла подкачки можно выделить зарезервированный блок (MEM_RESERVE) охраняемых страниц (PAGE_GUARD) и коммитить их только при попытках доступа, а старые страницы при этом снова отправлять в резерв. То есть, получится такой аллокатор памяти с отслеживанием нарушений доступа по исключению. Система использует этот механизм для динамического увеличения размера стека. том числе на уровне CPU. Но существует путаница между виртуальной памятью и файлом подкачки, хотя это разные вещи.
2
|
|||||
| 13.07.2013, 10:06 | |
|
Динамически выделить память под массив Дан двумерный массив на 5х5 размером. Заполнить нулями под главной диагональю Почему не выделяется память под двумерный массив? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
ИИ и человечность
kumehtar 21.07.2026
Забавно, что общаясь с ИИ, я замечаю, насколько он высказывается умно, и насколько верит в людей. Он умеет прощать. Он знает как отвечать не обесценивая опыт других людей, даже если сам не верит. Он. . .
|
Нейтральные знания ..., ... чистая наука. Пока что-то проходит модерацию на Хабре, стоит развить мысль ...
Hrethgir 20.07.2026
К таким радикальным взглядам я конечно в той публикации не приходил, но чтобы скоротать вечер, решил углубиться немного.
1. Почему показания термометра заряжены целью?
Цель заложена в самом. . .
|
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
|
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
|
|
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения.
https:/ / habr. com/ ru/ sandbox/ 295048/
По ссылке 403. Не очень информативно такую ссылку постить.
Запись от Usaga размещена Сегодня в 06:46 . . .
|
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
|
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано
Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
|
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано
Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
|