2015-08-26 6 views
1

Я думаю, что я понял выравнивание стека, которое составляет 4 байта, например, если я добавлю только один символ, его адрес будет справа от 4 байтов (немного раньше, если есть другие 1 или 2 байта)Сборка - выравнивание кучи - x86 intel

Все еще я не могу понять выравнивание в куче, я думал, что есть выравнивание по 4 байта или 8 байт, но вот что, когда я выделяю 100, а затем 20 байт, есть 4 байта между концом первого и началом второго, поэтому я догадался, что куча будет использовать выравнивание по 8 байт.

Путем последовательного выделения 1 4 7 8 9 14 16 17 байт Я заметил, что 1, 4, 7, 8, 9 принимают по 16 байт каждый и 14 16 17 принимают 24 байта, почему так?

Я использую C/C++ и используя malloc для выделения (то же самое с новым).

Спасибо.

+0

Возможно, это зависит от того, как вы выделяете эти вещи, которые вы не указали. –

+0

Извините, я использую C/C++, и я выделяю их с помощью malloc. – x4rkz

ответ

3

В Windows зарегистрирована функция malloc, чтобы вернуть память, выровненную на 8-байтной границе для 32-разрядных приложений, и на 16-байтной границе для 64-разрядных приложений. В Linux, это только говорит, что она возвращает «память, которая соответствующим образом выровненную для любого вида переменной», но это, вероятно, также 8 и 16.

Кроме того, malloc необходимо резервировать дополнительный памяти для хранения данные отслеживания, необходимые для управления кучей. Это означает, что когда вы запрашиваете N байтов, malloc фактически будет использовать байты N + X, причем X будет постоянным и зависит от реализации.

+0

Спасибо, действительно, я использую Linux, по-прежнему странно, что для распределения 1 байт требуется 16 байт (15 дополнительных байтов), тогда как для распределения 100 требуется 104 байта. У этого лишнего байта для управления кучей есть имя, чтобы я мог провести некоторое исследование? Или у вас есть страница документации? – x4rkz

+0

@ x4rkz Около 1 байта, которому требуется 16, механизм распределения, вероятно, не так прост. Может быть, выделение 104 или 105 байтов будет использовать 112? Если это так, возможно, дополнительные данные нуждаются в некотором выравнивании. О самих дополнительных данных, я точно не знаю, как это работает, но я думаю, что это указатель на некоторую структуру состояния malloc. Я не уверен, что у него есть особое имя. – ElderBug

1

Выравнивание - это только расположение начала чего-то: его адрес будет кратным A. Где менеджер памяти помещает эти распределения и почему это полностью его бизнес и может быть (частично) зависимым на других вещах, происходящих на компьютере вне вашей программы. Это означает, что вы не можете определить «размер» предыдущего распределения по местоположению «следующего» (в то время как он может быть рядом с вашей программой, он может быть не рядом с менеджером памяти); на самом деле возможно, что в «следующем» распределении есть меньший адрес (если, например, в промежуточный период была освобождена более низкая память).