有人请告诉我对齐指针实际意味着什么?
答案 0 :(得分:36)
这意味着指向的地址可以被某个因子整除。
有时会使用术语“自然对齐”,这通常意味着需要将具有自然对齐的对象放置在可被对象大小均匀分割的地址处。
对齐有时非常重要,因为许多与硬件相关的事情限制了这种对齐。
例如,在经典SPARC架构(以及经典ARM上,我认为),您无法从奇数地址读取大于一个字节的整数。试图这样做会立即停止您的程序与总线错误。在x86架构上,CPU硬件改为处理问题(通过根据需要对缓存和/或内存进行多次访问),尽管可能需要更长时间。 RISC:其他架构通常不会为您执行此操作。
像这样的事情也会影响填充,即在例如插入之间插入伪数据。结构字段以保持对齐。像这样的结构:struct example
{
char initial;
double coolness;
};
很可能最终在字段之间有7个字节的填充,以使double
字段对齐一个可被其自身大小整除的偏移(我假设为8)。
以二进制形式查看时,与 n 字节对齐的地址将其log2( n )最低有效位设置为零。例如,需要32字节对齐的对象将具有以(二进制)00000结尾的正确对齐的地址,因为log2(32)为5.这也意味着可以通过清除所需的数字来强制对齐地址比特。
答案 1 :(得分:3)
要添加到unwind正在解释的内容,这里是我最近在作业中使用的struct
:
struct infosale {
int noseq;
char salesman[30];
char product[11];
int count;
};
您可能希望此struct
的大小为(4 + 30 + 11 + 4 =)49
个字节,但事实上52
与sizeof
相比较}。由于noseq
为4
字节+ salesman
为32
字节(对齐)+ product
为12
字节(对齐)和{{1} }是count
个字节,因此4
个字节。
答案 2 :(得分:2)
取决于上下文,但它可能是指针本身对齐,或指向对齐的内容。
'对齐'表示某个对象存储在某个常量的倍数的地址处。例如。对于32位整数,这几乎总是4.这是因为一个字节是8位:4 * 8 = 32位。如果对象存储在对齐的地址,处理器通常可以执行更快的内存访问,或者对于某些处理器,甚至不可能进行未对齐的访问。
答案 3 :(得分:1)
它是指向“对齐”地址的指针。在地址是某个值的倍数的意义上对齐 - 通常是指向它的任何类型的事物的大小(如果是基本类型),或者是需要这种对齐的某个数据成员的大小。
通常你不必担心这个;内存分配函数将确保它们为您提供的内存正确对齐。你开始担心在使用指针转换开始做不安全事情时的对齐。
答案 4 :(得分:0)
正如人们在我之前提到的那样,这意味着你的指针可以被一定数量的字节整除。
要检查指针是否对齐,您可以执行以下操作:
isaligned = !( (long)pointer % bytes );
现在,如果“指针”与“字节”字节对齐,则“isaligned”为真。
答案 5 :(得分:0)
对齐指针意味着具有相邻内存位置的指针可以通过添加常量及其倍数来访问
代表char a[5] = "12345";
这里a
是常量指针,如果你和每次你可以访问下一个字符时的字符大小,
a
+ sizeofchar将访问2
a
+(sizeofchar * 2)将访问3
,依此类推
类似地,如果您逐位访问变量值。