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