noexcept对标准库容器性能的影响
C++中noexcept关键字如何影响标准库容器的性能?特别是std::vector的移动操作、std::swap和std::pair等。为什么noexcept移动操作对vector扩容至关重要?
回答
小字辈
noexcept直接影响标准库对移动操作的选择策略。vector扩容:扩容时若元素的移动构造是noexcept,vector使用移动;否则回退到拷贝。因此std::vector<std::unique_ptr<T>>的扩容高效(unique_ptr移动构造noexcept),而std::vector<MyType>若MyType移动未标记noexcept则使用拷贝。std::swap:标准库使用带noexcept的移动构造+移动赋值实现高效swap。std::pair/tuple:移动构造是否noexcept取决于成员。容器接口:std::vector::resize、std::deque等容器扩展操作都受此影响。性能差异:拷贝100万个元素(每个含4KB数据)vs移动(只交换指针),差距可达万倍。规则:构造函数和赋值操作尽可能noexcept;swap应始终noexcept;移动操作不应分配资源或抛出异常。C++17起noexcept是函数类型系统的一部分。注意:误标noexcept若抛出异常程序将终止(通过std::terminate)。