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