如何解决对齐不感知数组形式分配函数的标准库版本是否满足对齐要求?
相关段落是[basic.stc.dynamic.allocation]/3(强调我的):
(3) 对于保留布局分配函数以外的分配函数,调用成功返回的指针应表示如下对齐的存储地址:
(3.1) -- 如果分配函数采用 std::align_val_t
类型的参数,则存储将具有由该参数的值指定的对齐方式。
(3.2) -- 否则,如果分配函数被命名为operator new[]
,则存储为任何没有新扩展对齐且no的对象对齐大于请求的大小。
(3.3) -- 否则,对于没有新扩展对齐并且请求大小的任何对象,都会对齐存储。
我的理解如下:
单对象和数组形式的对齐不感知分配函数都将保证对齐限制为 __STDCPP_DEFAULT_NEW_ALIGNMENT__
。
有了这个约束,并假设 __STDCPP_DEFAULT_NEW_ALIGNMENT__ == 8u
:
- 单对象形式针对 请求大小的任何对象进行对齐。因此,4 字节的请求只能保证 4 字节对齐的存储,因为 8 字节对齐的对象的大小至少为 8 字节。 3 字节的请求只能保证 1 字节的对齐,因为具有任何更严格对齐的对象的大小不能为 3 字节。 (对象的大小是其对齐要求 (
sizeof(x) % alignof(decltype(x)) == 0
) 的(非零)倍数。) - 数组形式针对不大于请求大小的任何对象进行对齐。因此,4 字节的请求只能保证 4 字节对齐的存储(如上所述),但 3 字节的请求将保证 2 字节对齐,因为 2 字节对齐的对象可以大小只有 2 个字节。
因此数组形式必须提供更强的保证;它必须满足对象超集的对齐要求,而单对象形式必须满足这些要求。换言之,前者的后置条件包含(并加强)了后者的后置条件。然而,数组形式的标准库版本的默认行为是简单地转发到相应的单对象形式并返回其结果。这是否意味着 ::operator new[](3)
与 ::operator new(3)
等效(默认情况下)会产生一个指向存储的指针,该指针仅保证 1 字节对齐,不符合上述要求?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。