由非扩展分配函数创建的字符数组

Array of char created by non extended allocation function

本文关键字:字符 数组 创建 函数 扩展 分配      更新时间:2023-10-16

N3797第5.3.4/10节规定:

当new-expression调用分配函数时,该分配未扩展

[…]

对于char和unsigned char类型的数组new-表达式的结果与地址之间的差异分配函数返回的值应为的整数倍最严格的基本对准要求(3.11)的任何对象类型,其大小不大于正在使用的数组的大小创建。

我不明白那个限制。

考虑以下赋值给char *p的new-expression结果:
char *p = new char[5];

让在计算new-expression分配函数时返回指向地址a1的指针。确定T型asizeof(T)<=5最严格基本对齐的算法是什么?实现如何确定地址a1+a是否存在?

当您执行数组new时,传递给分配函数的大小是您正在分配的数组的大小加上未指定数量的数组分配开销。分配函数需要返回一个指针,该指针指向任何具有基本对齐方式的类型的对齐地址:

  ---------------------------------------
  |  overhead  | actual array           |
  ---------------------------------------
  ^            ^
  |            |
  |            What the array new expression returns
  | 
  What the allocation function returns
  (correctly aligned for any object type with fundamental alignment)

因此,"new-expression的结果与分配函数返回的地址之间的差值"就是数组分配开销的大小。

基本对齐是小于或等于alignof(std::max_align_t)(§3.11 [basic.align]/p2)的对齐,并且对齐必须是2的幂(p4)。因此,很容易确定"T类型的a最严格的基本对齐sizeof(T)"不大于任何给定的数字。可能的基本排列只有这么多。

您引用的要求要求数组new表达式的返回值对任何类型的基本对齐都要正确对齐,以适应缓冲区。通过将数组分配开销的大小调整为对齐要求的倍数,实现可以很容易地做到这一点。它可以简单地通过将开销大小设置为alignof(std::max_align_t)的倍数来实现这一点,这样数组new返回的指针总是对任何具有基本对齐的类型进行对齐。