2010-10-22 58 views

回答

6

Alignment要求指定哪些地址偏移量可以分配给哪些类型。这完全取决于实现,但通常基于字大小。例如,一些32位体系结构要求所有变量都以4的倍数开始。在某些体系结构中,对齐要求是绝对的。在其他人(例如x86)上嘲讽他们只会带来性能损失。

malloc需要返回适合任何对齐要求的地址。换句话说,返回的地址可以分配给任何类型的指针。从C99§7.20.3(存储器管理功能):

指针返回如果分配成功 适当地对准,使得它 可以被分配给一个指向任何 类型的对象,然后用于访问 这样的对象或者这样的对象的数组在分配空间中的对象(直到 空间被明确地解除分配)。

1

如果你有特别的记忆alignemnt需要(特定的硬件或库),你可以检查出非便携式内存分配,如_aligned_malloc()memalign()。这些可以很容易地在“便携式”界面后面抽象出来,但不幸的是非标准。

43

假设你有结构。

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字节的类型(intfloat,和在32位的系统指针)是4字节对齐。

malloc是C标准所要求的,用于返回一个针对任何数据类型正确对齐的指针。

x86-64上的glibc malloc返回16字节对齐的指针。

+0

非常好的解释,确实如此。 – AnyOneElse 2013-08-22 12:53:23

+0

很好的解释。 – hagrawal 2016-01-31 22:36:35

+0

对不起,我不知道你的意思是什么“char是1字节对齐,短为2字节对齐和4字节类型”是常见的。 – 2016-11-19 07:42:30

1

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

这是一个想要使用这种需求的最新功能。

相关问题