N3797第5.3.4 / 10节说:
当new-expression调用分配函数和分配时 没有延长
[...]
对于char和unsigned char数组, new-expression的结果与地址之间的差异 由分配函数返回的应是整数倍 任何对象的最严格的基本对齐要求(3.11) type的大小不大于数组的大小 创建
我不明白这种限制。
考虑分配给char * p的以下新表达式结果:
char *p = new char[5];
在评估new-expression分配函数时,让返回指向地址a1
的指针。确定a
类型T的最严格基本对齐sizeof(T)<=5
的算法是什么?实现如何确定地址a1+a
是否存在?
答案 0 :(得分:2)
当您执行数组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)。因此,很容易确定“a
”类型T
不超过任何给定数字的“最严格的基本对齐sizeof(T)
。只有很多可能的基本对齐。
您引用的要求要求数组new
表达式的返回值正确对齐任何具有适合缓冲区内基本对齐的类型。通过将阵列分配开销的大小调整为该对齐要求的倍数,可以轻松实现该实现。通过使开销大小为alignof(std::max_align_t)
的倍数,可以轻松实现此目的,以便数组new
返回的指针始终与任何具有基本对齐的类型对齐。