究竟是什么'对齐指针'?

STR*_*ER 37 c c++

有人请告诉我对齐指针究竟意味着什么?

unw*_*ind 38

这意味着指向的地址可以被某个因子整除.

有时使用术语"自然对齐",这通常意味着需要将具有自然对齐的对象放置在可被对象大小均匀分割的地址处.

对齐有时非常重要,因为许多与硬件相关的东西限制了这种对齐.

例如,在经典的SPARC架构(以及经典的ARM,我认为)中,您无法从奇数地址读取大于一个字节的整数.试图这样做会立即停止您的程序与总线错误.在x86架构上,CPU硬件改为处理问题(通过根据需要对缓存和/或内存进行多次访问),尽管可能需要更长时间.RISC:其他架构通常不会为您执行此操作.

这些事情也会影响填充,即在例如结构字段之间插入虚拟数据以保持对齐.像这样的结构:

struct example
{
  char initial;
  double coolness;
};
Run Code Online (Sandbox Code Playgroud)

很可能最终在字段之间有7个字节的填充,以使double字段对齐一个可被其自身大小整除的偏移(我假设为8).

当以二进制查看时,与n个字节对齐的地址将其log2(n)最低有效位设置为零.例如,需要32字节对齐的对象将具有以(二进制)00000结尾的正确对齐的地址,因为log2(32)为5.这也意味着可以通过清除所需的数字来强制对齐地址比特.

  • "对齐到n个字节"应该读为"与n*位*对齐",因为log2(1)= 0.你的意思是log2(8)= 3. (2认同)

Yan*_*hon 6

为了补充unwind的解释,这是struct我最近在作业中使用的:

struct infosale {               
    int   noseq;                
    char  salesman[30];         
    char  product[11];          
    int   count;                
};                               
Run Code Online (Sandbox Code Playgroud)

您可能期望它的大小struct为 (4+30+11+4=)49字节,但实际上它是52sizeof. 因为noseqis 4bytes + salesmanis 32bytes (aligned) + productis 12bytes (aligned) 和countis 4bytes,因此是52bytes。