gpt4 book ai didi

STL - 交换的 noexcept 规范对性能有影响吗?

转载 作者:行者123 更新时间:2023-12-01 02:44:25 25 4
gpt4 key购买 nike

noexcept众所周知,移动构造函数的规范对 C++0x 的性能有影响。例如,std::vector<T>::resize , std::vector<T>::reserve如果可以证明它不会抛出,则可以使用 T 的非抛出移动构造函数。 noexcept运算符是在编译时检查该属性的方法。如果 noexcept 说 T 的 move-ctor 不抛出,则 T 对象将被移动而不是复制,最有可能实现更高的性能。

我的问题是关于用户定义类 T 的成员交换或命名空间级交换。C++0x 规范在导出 std::pair 的 noexcept 规范方面花费了一些精力。 , std::tuple , std::array:swap可能表明用户定义的类应该尝试使用相同的原则。例如,std::pair::swap被声明为等价于:

void std::pair::swap(pair& p) noexcept(noexcept(swap(first, p.first)) && noexcept(swap(second, p.second));

它基本上说,如果 first 的任何一个交换,该对的交换都会抛出。或 second成员抛出。交换 first , second就其成员而言,可能有自己的 noexcept 规范。

最后的问题是:是否有通用算法(在 STL 或其他方式中)根据交换的 noexcept 规范做不同的事情?此外,是否有性能影响?

最佳答案

除了当某些内容为 noexcept(例如 std::vector)时特别表现不同的代码之外,声明一个函数 noexcept 可以允许编译器进行自己的优化。至少编译器不必跟踪异常处理中涉及的某些事情,这可能会释放寄存器或执行更少的指令等。

关于STL - 交换的 noexcept 规范对性能有影响吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7251486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com