对齐不感知数组形式分配函数的标准库版本是否满足对齐要求?

如何解决对齐不感知数组形式分配函数的标准库版本是否满足对齐要求?

相关段落是[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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?