我也想知道glibc malloc()是否做到这一点。什么是对齐的内存分配?
回答
Alignment要求指定哪些地址偏移量可以分配给哪些类型。这完全取决于实现,但通常基于字大小。例如,一些32位体系结构要求所有变量都以4的倍数开始。在某些体系结构中,对齐要求是绝对的。在其他人(例如x86)上嘲讽他们只会带来性能损失。
malloc
需要返回适合任何对齐要求的地址。换句话说,返回的地址可以分配给任何类型的指针。从C99§7.20.3(存储器管理功能):
指针返回如果分配成功 适当地对准,使得它 可以被分配给一个指向任何 类型的对象,然后用于访问 这样的对象或者这样的对象的数组在分配空间中的对象(直到 空间被明确地解除分配)。
如果你有特别的记忆alignemnt需要(特定的硬件或库),你可以检查出非便携式内存分配,如_aligned_malloc()
和memalign()
。这些可以很容易地在“便携式”界面后面抽象出来,但不幸的是非标准。
假设你有结构。
struct S {
short a;
int b;
char c, d;
};
没有对准,这将在内存中排列这样(假设32位体系结构):
0 1 2 3 4 5 6 7
|a|a|b|b|b|b|c|d| bytes
| | | words
的问题是,在某些CPU架构中,指令加载4内存中的字节整数仅适用于字边界。所以你的程序必须用单独的指令来获取b
的每一半。
但如果记忆被布置为:
0 1 2 3 4 5 6 7 8 9 A B
|a|a| | |b|b|b|b|c|d| | |
| | | |
然后访问b
变得简单。 (缺点是需要更多的内存,因为填充字节。)
不同的数据类型有不同的对齐要求。是很常见的char
为1字节对齐,short
为2字节对齐,以及4字节的类型(int
,float
,和在32位的系统指针)是4字节对齐。
malloc
是C标准所要求的,用于返回一个针对任何数据类型正确对齐的指针。
x86-64上的glibc malloc
返回16字节对齐的指针。
非常好的解释,确实如此。 – AnyOneElse 2013-08-22 12:53:23
很好的解释。 – hagrawal 2016-01-31 22:36:35
对不起,我不知道你的意思是什么“char是1字节对齐,短为2字节对齐和4字节类型”是常见的。 – 2016-11-19 07:42:30
的malloc()
文件说:
[...] the allocated memory that is suitably aligned for any kind of variable.
这是在C很多要做的事情/ C++实现。但是,正如其他人所指出的,存在许多特殊情况并需要特定的对齐。例如,英特尔处理器支持256位类型:__m256
,这肯定不会被malloc()
考虑在内。类似的,如果你想为要分页的数据分配一个内存缓冲区(类似于mmap()
等返回的地址),那么你需要一个可能非常大的对齐,如果malloc()
是返回始终与这些边界对齐的缓冲区。
在Linux或其他Unix系统,我建议你使用posix_memalign()
功能:
int posix_memalign(void **memptr, size_t alignment, size_t size);
这是一个想要使用这种需求的最新功能。
- 1. boost :: shared_array和对齐的内存分配
- 2. 如何分配4K对齐的内存
- 3. 让std :: vector分配对齐的内存
- 4. Java的内存分配对齐
- 5. Win32内存分配与大对齐
- 6. 分配32字节对齐内存的分配器
- 7. 在堆上分配的内存块是否保证了对齐?
- 8. “内存是8字节对齐”是什么意思?
- 9. 什么意思是“缓存线对齐”?
- 10. 缓存对齐英特尔CPU上的内存分配
- 11. 为什么BitmapData.copyPixels会分配内存?
- 12. 对象的内存分配
- 13. 先前分配对象的内存会发生什么?
- 14. 你对分配内存的函数有什么命名约定?
- 15. 对于C++分配器,std :: align_val_t有效的对齐值是什么?
- 16. SSE2 - 16字节对齐的内存动态分配
- 17. 如何使tr1 :: array分配对齐的内存?
- 18. 非齐次数组的内存分配是如何工作的?
- 19. 使用pci_alloc_consistent分配内存的限制是什么?
- 20. 什么是测量Windows内存分配的好工具?
- 21. PDF内存分配背后的秘密是什么(CGPDFDocumentRef)
- 22. “......的字节分配内存不足”是什么意思? (Android)
- 23. 什么是适合中型内存分配的大小?
- 24. iPhone:Xcode,乐器,内存分配。什么是合理的?
- 25. g ++在堆栈上分配未使用的内存是什么?
- 26. 什么是副作用?为什么内存分配不是副作用?
- 27. 为类型化内存视图分配内存的建议方式是什么?
- 28. 什么是内核部分不匹配?
- 29. 为什么虚拟内存分配是远远高于居民的内存分配更高的解释语言
- 30. 对齐不包括对齐分配
不会是目标架构的依赖吗?它几乎肯定是一致的... – 2010-10-22 05:06:40