Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.79
Ivan Fantom
5 / 5 / 1
Регистрация: 12.10.2011
Сообщений: 75
#1

Выделите-ка под массив память размером 32 ГБ - C++

11.07.2013, 22:45. Просмотров 2596. Ответов 40
Метки нет (Все метки)

Получил ряд вопросов от одной фирмы. Надо ответить чтобы удостоить себя собесодованием) Вот один из них.

Словесно представьте вашу последовательность действий при написании программного кода заданий описанных ниже с учетом всех возможных на Ваш взгляд багов:

а) Приведите любой пример выделения памяти под массив, где размер выделяемой памяти должен составлять = 235 байт и заполните его случайными значениями.

б) Переэлокейтите массив, чтобы его размерность увеличилась с 235 до 235 + 100.

Про а)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main()
{
    unsigned long long size = 1024*1024*1024;
    size *= 32;
 
    char* ms = new char[size];
    
    for(int i=0;i<size;i++)
        ms[i] = i + '0';
 
    cout << ms[size-1] << endl;
 
    delete[] ms;
    return 0;
}
Само выделение памяти прошло без проблем, а вот когда началась инициализация, то на 1305 ячейке массива вижла сообщает об ошибке.
Изначально я понимал, что выделить такой большой кусок памяти тривиальными средствами не получится. Но я просто не знаю какими средствами можно решить поставленную задачу.
0
Миниатюры
Выделите-ка под массив память размером 32 ГБ  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.07.2013, 22:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Выделите-ка под массив память размером 32 ГБ (C++):

Динамически выделить память под массив - C++
Задание было в следующем: дан вещественный двумерный массив А. Поменять местами максимальный элемент главной и побочной диагоналей с...

Динамически выделить память под массив - C++
Добрый день форусчани Как можно выделить память под массив объекта класса class Save_Colection { public: pk *field; ...

Выделить и удалить память под 4 мерный массив - C++
пацаны помогите.. Добавлено через 1 час 11 минут .помогите..не могу вобще натйи 4 мерные масивы..только 2хмерные

Как выделяется память под массив string? - C++
В общем читаю книжку, там объявлены два массива int* p = new int, int* v = new string... бла бла бла ....а потом -&gt; ...После резервирования...

Выделить память под динамический массив указателей - C++
Нужно выделить память вот под такое дело. Для примера n=5 . Ничего нагуглить так и не смог :( что есть : #include &quot;stdafx.h&quot; ...

Как выделить память под массив в структуре? - C++
Здравствуйте , воnрос конечно глуnый , но голову я сижу ломаю долго , есть Структура , в ней есть массив , как nод этот массив выделить...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
12.07.2013, 00:14 #16
4 байта, если проект собирается в 32 битах.
если собирать 64 битный экзешник - то там sizeof(std::size_t) == sizeof(unsigned long long)
только пробовать выделять столько памяти не хочется. если начнется своп, то винда начнет жутко тупить. пусть автор пробует
1
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
12.07.2013, 00:18 #17
Ну вот и ответ. Где же мы возьмём ЭВМ 64 бита?
0
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
12.07.2013, 00:26 #18
сейчас новые 32 битные процы для персоналок поискать еще нужно. все давно уже 64 битное.
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.07.2013, 01:00 #19
Если собирать x64 проект, то исключение (bad_alloc), если 32 - тишина.
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
12.07.2013, 01:21 #20
Цитата Сообщение от alsav22 Посмотреть сообщение
Если собирать x64 проект, то исключение (bad_alloc), если 32 - тишина.
Очевидно, в 32хбитном проекте при вызове new char[size] происходит приведение типов,
size_t при win32 означает тип unsigned int.
т.е. идёт приведение "длиннодлинного" size=1024ull*1024ull*1024ull*32ull; к типу unsigned int. После приведения в new передаётся НОЛЬ(!) в 32хбитных системах.
О чём мы тут и болтали.
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
12.07.2013, 11:24 #21
Где-то на форуме уже писал про это - на 64 битной ОС добиться std::bad_alloc еще постараться надо. Дело в том, что оператор new() работает с виртуальными адресами, и ничего не мешает выделить, например, 1 ТБ (это под Linux, в винде есть ограничение памяти на процесс, вроде 17 гигов, но точно не помню). Если выделить 10 ТБ, то никакого std::bad_alloc не будет, все пройдет хорошо. Проблемы начнутся при записи/чтении в/из этой памяти. Потому обертывать new в try{}catch(){} на 64 битной ОС по сути бесполезное занятие.
1
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.07.2013, 14:45 #22
Цитата Сообщение от Kastaneda Посмотреть сообщение
Где-то на форуме уже писал про это - на 64 битной ОС добиться std::bad_alloc еще постараться надо. Дело в том, что оператор new() работает с виртуальными адресами, и ничего не мешает выделить, например, 1 ТБ (это под Linux, в винде есть ограничение памяти на процесс, вроде 17 гигов, но точно не помню). Если выделить 10 ТБ, то никакого std::bad_alloc не будет, все пройдет хорошо. Проблемы начнутся при записи/чтении в/из этой памяти. Потому обертывать new в try{}catch(){} на 64 битной ОС по сути бесполезное занятие.
Вот код и результат на 64-битной XP:
C++
1
2
3
4
5
6
7
8
9
int main()
{
    unsigned long long size = 1024*1024*1024;
    size *= 32;
 
    char* ms = new char[size];
    
    return 0;
}
0
Миниатюры
Выделите-ка под массив память размером 32 ГБ  
Programmer c
5 / 0 / 2
Регистрация: 06.07.2013
Сообщений: 59
12.07.2013, 15:05 #23
Многовато))) 32 гб)
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
12.07.2013, 15:09 #24
alsav22, я ж написал, что в винде ограничение на каждый процесс есть. Вот на 64 битном Linux'е запустил такой код
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
int main() 
{
    for (int i = 0; i < 1024 * 100; i++) { // всего "выделится" 100 ТЕРАбайт
        try {
            char *p = new char[1024 * 1024 * 1024];
        } catch (std::exception &e) {
            std::cout << e.what() << std::endl;
        }
    }
}
код отработал молча, т.е. память как бы выделилась.
0
alsav22
12.07.2013, 17:42
  #25

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
alsav22, я ж написал, что в винде ограничение на каждый процесс есть.
Прошу прощения, пропустил, что это про Linux пишется.

0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
12.07.2013, 17:53 #26
Цитата Сообщение от alsav22 Посмотреть сообщение
пропустил, что это про Linux пишется.
Не то, чтобы совсем под Linux, т.к. Windows это тоже касается. Даже несмотря на виндовые ограничения в x86_64 все равно можно "выделить" больше памяти, чем есть реально (ну только если физически все же меньше памяти, чем ограничение в N гигов).
У меня нет 64 битной винды, проверить доступный размер не могу, но, если кому не сложно, можно выполнить следующий код и выложить результат.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
int main() 
{
    for (int i = 0; i < 1024 * 100; i++) { 
        try {
            char *p = new char[1024 * 1024 * 1024];
            std::cout << i << "GB" << std::endl;
        } catch (std::exception &e) {
            std::cout << e.what() << std::endl;
            return 0;
        }
    }
}
если исключение выкинется сразу, то можно поступить так
C++
1
char *p = new char[1024 * 1024 * 1024 / 2];
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.07.2013, 18:03 #27
Это при 4Гб памяти.
0
Миниатюры
Выделите-ка под массив память размером 32 ГБ  
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
12.07.2013, 18:09 #28
Хм, странно, я своими глазами видел, как винда выдавала сообщение про ограничение в 17 (точно не помню) GB. Может в винде такие вещи где-то настраиваются.
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.07.2013, 18:28 #29
Но не болше же чем физической памяти?
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
12.07.2013, 19:22 #30
Kastaneda, Данный код подвесил мою систему наглухо... bad_alloc не дождался... Вообщем, жесть)
В release после 3 ГБ вышел bad_alloc, 4 ГБ в системе.
http://stackoverflow.com/questions/4...e-in-a-program
On 32-bit Windows your application would stop at 4GB. On 64-bit Windows your application will stop at 16TB (assuming you have a page file that can grow automatically, and that much hard disk space).
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2013, 19:22
Привет! Вот еще темы с ответами:

Динамически выделить память под массив функций - C++
QByteArray (SerfingThread::*lp_GetRequest)(const QByteArray&amp; ,const QByteArray&amp;); как сделать тоже самое только через new? как правильно...

Выделить память под массив неизвестной длины - C++
для программы нужен массив int Array т.е. длину строки я знаю, а сколько строк у меня будет - не представляю. я знаю, что...

Выделить память под массив размера 2^64 байтов - C++
Требуется выделить память под массив размера 2^64 байтов. Как порекомендуете решать данную задачу?

Почему не очищает память, выделенную под массив структур - C++
#include &lt;cstdlib&gt; #include &lt;iostream&gt; using namespace std; const int ar_size=20; struct CandyBar { char name; double...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.07.2013, 19:22
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru