Как правильно подсчитать количество выделенных байт когда используется aligned выделение памяти?

Есть вот это. 10 байт, выравнивание 1024.

_aligned_malloc( 10, 1024 );

Сколько выделится памяти? 10 * 1024?


Ответы (2 шт):

Автор решения: 0andriy

Строго говоря выделение памяти и выравнивание ортогональны друг другу. В вашем примере выравнивание определено как 1024, то есть зануление младших 10 бит адреса. Например, для 32-битного адресного пространства это будет двоичное число xxxx xxxx xxxx xxxx xxxx xx00 0000 0000. Размер выделяемой памяти зависит от алокатора, если используется напрямую тот, что даёт ядро операционной системы, то скорее всего выделится одна страница памяти (чаще всего 4096 байт), но и там не всё так просто. Ах да, если размер выделяемой памяти при заданном выравнивании не получается найти (в большинстве случаев из-за фрагментации), то вернётся код ошибки.

Более подробно по теме: https://en.wikipedia.org/wiki/Data_structure_alignment и https://en.wikipedia.org/wiki/Memory_management#ALLOCATION (увы, на русском быстро ничего хорошего не нашёл)

→ Ссылка
Автор решения: avp

В Linux (и м.б. в части остальных *nix-ов) для получения ответа на вопрос:

сколько памяти выделено вызовом функции из семейства malloc()?

можно вызвать функцию malloc_usable_size

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

#include <stdio.h>
#include <malloc.h>
     
int
main (int ac, char *av[])
{
  char *a = malloc(1);
  char *b = memalign(4096, 1);

  printf("alloc(1) usable: a (%p) = %d  aligned to 4096 b (%p) = %d\n",
     a, (int)malloc_usable_size(a), b, (int)malloc_usable_size(b));

  return puts("End") == EOF;
}

Компилируем и смотрим:

avp@avp-desktop:~/avp/hashcode$ gcc ttt.c && ./a.out
alloc(1) usable: a (0x5577e496f260) = 24  aligned to 4096 b (0x5577e4970000) = 24
End
avp@avp-desktop:~/avp/hashcode$ 
→ Ссылка