是否保证对象地址是其类型对齐的多个对象?

时间:2018-07-16 07:37:19

标签: c++ alignment language-lawyer memory-address

对齐方式的定义如下in the Standard

  

对齐方式是实现定义的整数值,表示可以分配给定对象的连续地址之间的字节数

但是,这并不意味着这些地址是对齐值的倍数。例如,位于地址double0x01的两个0x09对象满足上述定义。

是否可以通过某种方式保证对象的地址是其类型的对齐值的倍数?

2 个答案:

答案 0 :(得分:2)

不,不是。

仅保证线性关系是成比例的,但是即使这样,例如在结构包装中也可以放宽对齐要求

/*packed*/ struct s {double a; char b; double c;);

请注意,nullptr甚至不必是零内存字节,虚拟内存或其他。

答案 1 :(得分:0)

对于不是struct或union成员的对象,本标准未定义观察对齐的任何方式,除非操作由于对齐错误而失败。如果平台可以静默处理具有任意对齐方式的对象(尽管可能不如正确对齐的对象那样快),并且该平台的实现未定义uintptr_tintptr_t,那么将会有无法检测到无法对齐独立对象的方式,因此不需要实际对齐对象。

大多数实现都将记录检测指针对齐的方式,并应处理对齐指令,以使其行为与其文档一致。一个人可以拥有一个合规的实现,而否则,就像一个人可以拥有合规但低质量的实现会执行各种奇怪的愚蠢的事情一样,但是高质量的实现应避免这种胡说八道。