C++ 大型对齐上'std::pmr::memory_resource::allocate()`的行为

C++ 大型对齐上'std::pmr::memory_resource::allocate()`的行为,c++,language-lawyer,c++17,C++,Language Lawyer,C++17,引用N4606: virtualvoid*do\u allocate(大小字节、大小对齐)=0 要求:校准应为2的幂 返回:派生类应实现此函数,以返回指向已分配存储(3.7.4.2)的指针,其大小至少为字节。返回的存储器与指定的对齐方式对齐(如果支持这种对齐方式);否则它将对齐到max\u align 抛出:如果派生类实现无法按请求的大小和对齐方式分配内存,则应抛出适当的异常 这一点尚不清楚:如果对齐是2的幂但不受支持(例如大于max\u align),会发生什么情况?返回的存储是否与max\u

引用N4606:

virtualvoid*do\u allocate(大小字节、大小对齐)=0

要求:校准应为2的幂

返回:派生类应实现此函数,以返回指向已分配存储(3.7.4.2)的指针,其大小至少为字节。返回的存储器与指定的对齐方式对齐(如果支持这种对齐方式);否则它将对齐到max\u align

抛出:如果派生类实现无法按请求的大小和对齐方式分配内存,则应抛出适当的异常

这一点尚不清楚:如果对齐是2的幂但不受支持(例如大于max\u align),会发生什么情况?返回的存储是否与max\u align对齐,还是引发异常?

当然有一个关于派生类实现的注释,但是由于
std::pmr::memory\u resource
是一个虚拟基类,所以每个实现都必须是这样的。

我相信规则适用于小于
max\u align
的对齐。如果您请求2或4字节对齐,如果这是系统提供的唯一内容,您可能会得到8。@BoPersson但根据定义,8字节对齐的内容也是2字节和4字节对齐的。在这种情况下,我看到的实现不会引发异常。您的问题的答案应该是“是”:您将返回与
max\u align
对齐的内存,或者如果实现无法返回与
max\u align
对齐的请求大小的内存,则会引发异常。另一种方法是对请求的每个不受支持的对齐抛出异常,这将导致返回到
max\u align
的子句不起作用,因此这显然不是目的。但由于“请求的[…]对齐”是相当明确的,并暗示其他方面,这可能是一个小缺陷。如果它的目的是为了进行大的对齐,那肯定是一个缺陷。谢谢!我报告了这个问题