获取对齐内存块有几种选择,但它们非常相似,问题主要在于您所针对的语言标准和平台。
C11
void * aligned_alloc (size_t alignment, size_t size)
POSIX
int posix_memalign (void **memptr, size_t alignment, size_t size)
视窗
void * _aligned_malloc(size_t size, size_t alignment);
当然,用手对齐也是一种选择。
英特尔提供了另一种选择。
英特尔
void* _mm_malloc (int size, int align)
void _mm_free (void *p)
基于Intel发布的源代码,这似乎是他们工程师喜欢的分配对齐内存的方法,但我找不到任何与其他方法相比较的文档。我发现的最接近的只是承认存在其他对齐内存分配例程。
要动态分配对齐内存,请使用由GCC和英特尔编译器支持的posix_memalign。使用它的好处是您不必更改内存处理API。您可以像往常一样使用free()。但是,请注意参数简介: posix_memalign ( **memptr,size_t对齐,size_t大小); Intel编译器还提供了另一组内存分配API。C/C++程序员可以使用_mm_malloc和_mm_free分配和释放对齐内存块。例如,以下语句为8个浮点元素请求一个64字节对齐内存块. __mm_malloc(8*sizeof( ),64); 使用_mm_malloc分配的内存必须使用_mm_free释放。在用_mm_malloc分配的内存上调用空闲或对使用malloc分配的内存调用_mm_free将导致不可预测的行为。
从用户的角度看,_mm_malloc
需要直接的CPU和编译器支持,_mm_malloc
分配的内存必须用_mm_free
释放。鉴于这些缺点,使用_mm_malloc?
的原因是什么?它是否具有轻微的性能优势?历史上的意外?
发布于 2015-09-16 15:44:27
_mm_malloc似乎是在标准aligned_alloc函数出现之前创建的,使用_mm_free的需求是实现的一个怪癖。
我的猜测是,与使用posix_memalign不同的是,它不需要为了保证对齐而过度分配,而是使用单独的对齐感知分配器。这将在分配与默认对齐方式不同的类型(通常为8或16字节)时节省内存。
https://stackoverflow.com/questions/32612881
复制相似问题