Является ли это правильной реализацией aligned_malloc()

#c #c #memory-management #alignment #allocation

#c #c #управление памятью #выравнивание #распределение

Вопрос:

Для повышения производительности я пытался реализовать функцию aligned_malloc() для выделения новой памяти с выровненным адресом, я знаю, что оператор «new» всегда возвращает выровненный адрес, но я хочу написать свою собственную функцию для лучшего понимания, это моя попытка :

 #include <iostream>
#include <stdlib.h>
/*
in purpose let's make our struct not aligned
*/
struct s{
        char foo[3]; 
};
s * array = NULL;
template <class t>
t* aligned_malloc(size_t array_size)
{
    t* array = NULL;
    char * ptr = (char*)  malloc((array_size 1)*sizeof(t)); // array_size 1 to not get out of memory when incrementing pointer
    while((((uintptr_t)ptr)%sizeof(t)) != 0 )
      ptr;
    return ((t*)ptr); 
}
int main()
{
    struct s * array = aligned_malloc<s>(10);
    /*
    let's test for crashs 
    */
    for (int c=0;c<10;c  )
    {
        array[c].foo[3] = 'f';
     }
    std::cout<<(((int)array)%sizeof(s))<<std::endl; // allways show '0' ,like the operator "new"
    system("pause");

}
  

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

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

Комментарии:

1. Какое ограничение на выравнивание? Предполагая, что вы пытаетесь дублировать другие реализации aligned_malloc() , вам нужно будет разрешить вызывающей стороне указать фактическое ограничение выравнивания (8 байт, 16 байт, 1 мегабайт …). Кроме того, вам, вероятно, следует использовать size_t вместо int в качестве типа ваших параметров. size_t беззнаковый и будет достаточно большим, чтобы обрабатывать все возможные запросы к памяти. int подписано — и запросы на объемы памяти меньше нуля не имеют смысла. int также имеет тенденцию составлять 32 бита, что ограничивает запросы памяти до менее чем 2 ГБ.

2. было бы неплохо, если бы вы написали ответ, в котором вы редактируете мой код

3. выравнивание должно вычисляться в соответствии с собственным значением архитектуры, но не размером структуры, подумайте о том, чтобы иметь <class t> из 3 байт.

4. это действительно так, прочитайте объявление struct Foo , и в этом случае что делать?

5. я думаю, что адрес объекта struct должен быть разделен на размер struct, И каждый элемент struct должен быть выровнен (его относительный адрес к struct делится на его размер), а для выравнивания массива объектов sizeof(struct) должен быть кратнымиз sizeof(int)