为什么std::allocator::deallocate不是noexcept的?

5
C++规范(ISO/IEC 14882:2011 + ISO/IEC 14882:2014)在表28中定义了释放内存的分配器要求,其中规定:

在调用此函数之前,指向 p 的区域中的所有 n 个 T 对象都应该被销毁。n 应该与 allocate 函数传递以获取此内存的值匹配。不会抛出异常。

但为什么 deallocate 仍然不是 noexcept?


4
标准中存在一个缺陷,而gcc和VS中则存在一个性能缺陷。当一个noexcept函数调用另一个不是noexcept的函数时,编译器必须添加额外的代码来调用terminate()以防异常发生。而那些会执行deallocate(例如析构函数)的东西通常被标记为noexcept。因此,没有必要装饰deallocate会导致代码膨胀。LLVM的libc++中的deallocatenoexcept的。这是一种符合规范的扩展,下面是如何编写缺陷报告以使其成为必需品:http://cplusplus.github.io/LWG/lwg-active.html#submit_issue - Howard Hinnant
2
我认为我上面关于这是gcc性能bug的评论是不正确的。更多的测试揭示了他们在其周围进行了优化。 - Howard Hinnant
1个回答

5

这是一个狭窄的合同(如果您传递给它一个未由allocate返回的指针,就会导致未定义的行为),因此根据标准库的通常政策,它不被标记为noexcept。


窄合同由N3279指定: 窄合同是一种不宽松的合同。当以违反文档合同的方式调用函数或操作时,窄合同会导致未定义行为。这样的合同至少规定了一个涉及参数、对象状态或某些外部全局状态(如静态对象的初始化)的前提条件。具有窄合同的标准函数的良好示例包括vector<T>::front()和vector<T>::operator - Sonic78

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接