#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)