Itanium ABI 规定异常的内存是通过调用 __cxa_allocate_exception(size) 获得的。返回的内存有什么对齐保证?
第4章第1.2节 明确指出:
展开接口使用指向异常头对象的指针作为表示抛出的异常的方式。通常,完整的异常对象的表示是特定于语言和实现的,但它将以由展开接口理解的标头为前缀,定义如下:
接着是对 struct _Unwind_Exception
的定义,随后是:
_Unwind_Exception
对象必须具有双字对齐。
由于这是一个在整个异常对象之前的前缀,整个内存块都必须具有双字对齐。
可以说,这段文本并没有禁止出现在 _Unwind_Exception
之前 的任意填充,但如果认为是这种情况,那么就不存在任何对齐保证;我选择将其解释为一个轻微的措辞缺陷。