почему malloc всегда возвращает адрес 0x ??????? 8 - PullRequest
2 голосов
/ 06 февраля 2012

Я пишу простой код: -

 void * aa = malloc(10 * sizeof(char));
 printf("%X\n", aa);
 free(aa);

Это всегда печатает ??????? 8, Я хочу спросить: Malloc всегда возвращает адрес 4 * n? И почему здесь последний номер адреса всегда равен 8? почему не 4 или С? моя среда: Ubuntu 10.04 (32 бит) gcc версия 4.4.3

Ответы [ 3 ]

8 голосов
/ 06 февраля 2012

Причины обычно кроются в выравнивании проблемах;существует ограничение для выполнения требований процессора, поддержки стратегий оптимизации кэша или других причин.

Как часть основной цели удовлетворения требований к выравниванию системы (ОС, спецификации языка, процессора), которые могли быв противном случае это может привести к сбоям (с различными воздействиями в зависимости от системы) или неэффективному поведению (при необходимости выполнять дополнительные операции чтения памяти, чтобы получить те же данные, которые пересекают границу блока памяти) во время выполнения, будет применяться минимальное требование выравнивания.

Однако вы можете найти эмпирически, что они выровнены в еще большей степени, чем это строго требовалось в предыдущих ограничениях.Например, конкретная реализация распределителя может увеличить его по следующим причинам:

  • добавление барьеров переполнения памяти и / или другие механизмы проверки / проверки целостности
  • позволяют более эффективно хранить указатели(например, если вы знаете, что младшие 4 бита равны нулю, вы можете упаковать их некоторым образом, если сохраните их
  • , упрощая или повышая эффективность вычисления адресов
  • , уменьшая фрагментацию и / или другиепричины, которые могут показаться неэффективными для отдельного распределения, но удовлетворяют некоторой цели в более широком наборе распределений
6 голосов
/ 06 февраля 2012

Существует несколько проблем:

  1. malloc() требуется для возврата выровненного адреса, чтобы его можно было использовать для любого типа данных.Более формально (C99 7.20.3):

    Указатель, возвращаемый в случае успешного выделения, соответствующим образом выравнивается, так что его можно назначить указателю на любой тип объекта и затем использовать для доступа к такому объектуили массив таких объектов в выделенном пространстве (пока пространство не будет явно освобождено).

  2. Реализатор распределителя может выбрать работу с блоками памяти, которые большечем самый маленький блок, подразумеваемый требованиями выравнивания.Это может быть сделано, например, из соображений эффективности (существуют компромиссы).

2 голосов
/ 06 февраля 2012

Причина - выравнивание, 8-байтовое выравнивание - то, что считается наиболее эффективным.

Вы можете начать здесь: http://www.delorie.com/gnu/docs/glibc/libc_31.html

...