@Pantene742

Как в C++ распределяется память?

Адреса выделяемых для элементов массива ячеек памяти иду по порядку. но что если вся память (предположим такую ситуацию) - заполнена через ячейку (под словом ячейка 8 бит). и я захочу создать массив которому места в кучи не будет. тогда массив заполнит свободные ячейки ? и соответственно адреса
уже не будут идти по порядку.
  • Вопрос задан
  • 1765 просмотров
Решения вопроса 2
@Mercury13
Программист на «си с крестами» и не только
Это называется фрагментация памяти. Некоторые «мусорщики» (как в Java или C#) способны сдвинуть объекты и получить большой непрерывный отрезок.
Менеджер памяти C++ дефрагментировать память не способен и выдаст нехватку памяти.
В любом случае, массив — что в Java, что в C++ — будет занимать непрерывный отрезок памяти.

Чтобы совмещать мусорные языки с системными интерфейсами, есть способы пометить структуру как неперемещаемую. Но это уже на стыке виртуальной машины Java/C# и системного кода, который пишется на Си(++).
Ответ написан
pi314
@pi314
Президент Солнечной системы и окрестностей
Смотря что именно подразумевается под "создать массив" )) Вот хорошая шпаргалка на тему, что это может означать и где он в результате окажется:

int arr1[100000]; // BSS
vector<int> arr2; // HEAP
 
struct DumbStruct {
    int someArr[10000];
};
 
int main () {
    int arr3[100000]; // STACK
    vector<int> arr4; // HEAP
    int* arr5 = new int[100000]; // HEAP
    int* arr6 = (int*) malloc(100000 * sizeof(int)); // HEAP
    static int arr7[100000]; // BSS
    DumbStruct struct; // STACK
    DumbStruct* struct2 = new DumbStruct(); // HEAP
    vector<DumbStruct> structarr; // HEAP
    int n;
    scanf("%d", &n);
    int arr8[n]; // STACK (assuming C99 -- this does not compile in C++)
}


Если речь именно о динамическом выделении памяти и именно о С++, то есть два варианта: malloc()/free() и new[]/delete[]. Теоретически в случае фрагментации памяти (когда ее, в принципе, достаточно, но не "одним куском") ни тот, ни другой не "заполнит" никаких "свободных" ячеек. malloc() вернет NULL, a new[] кинет std::bad_alloc.

А практически, конечно, возможно, что угодно... т.к. 1. new - это оператор, и значит, его можно переопределить, 2. с помошью std::set_new_handler ему можно подсунуть свой аллокатор, а также 3. полезет ли new[] вообще к malloc(), строго говоря, не гарантируется и, наконец 4. реализация malloc(), вообще-то, зависит от ОС, а они нынче умные и могут прореагировать как угодно - вплоть до убийства затребовавшего память процесса OOM менеджером.

Так что, наиболее точный ответ на вопрос: возможны варианты (хорошие и разные)... Однако, если суть вопроса в том, а не получится ли при этом случайно массив, который не массив, то ответ - нет, не получится. Массив, это семантическая конструкция языка. В С++ программист может полагаться на то, что память в массиве непрерывна.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы