当前位置: 首页 > news >正文

中国有名的网站建设公司seo推广公司哪家好

中国有名的网站建设公司,seo推广公司哪家好,孝感网站建设,聊城网站设计C11 noexcept关键字用于指定函数不会抛出异常,有助于提高程序的异常安全性,还能够使编译器生成更加高效的代码。 noexcept 是函数接口的一部分 函数是否声明为 noexcept 是接口设计的一部分,客户端代码可能会依赖这一点。如果一个函数被声明…

C++11 noexcept关键字用于指定函数不会抛出异常,有助于提高程序的异常安全性,还能够使编译器生成更加高效的代码。

  1. noexcept 是函数接口的一部分

函数是否声明为 noexcept 是接口设计的一部分,客户端代码可能会依赖这一点。如果一个函数被声明为 noexcept,客户端代码可能会假设这个函数在任何情况下都不会抛出异常,从而在调用这个函数时不会进行异常处理。更改函数的 noexcept 状态会影响到依赖这个函数的客户端代码。客户端代码可能需要进行相应的调整,例如增加异常处理逻辑,以应对新的异常抛出情况。

void safeFunction() noexcept;  // 客户端代码可能依赖此函数不抛出异常

2. noexcept 函数更容易优化

编译器可以利用 noexcept 信息进行更多的优化,例如不需要为异常处理保留栈信息,从而减少运行时开销。当一个异常被抛出时,程序需要找到一个合适的异常处理程序来处理这个异常。为了做到这一点,程序需要“展开”调用栈,即逐层回溯调用栈,直到找到一个匹配的异常处理程序。

栈展开的开销:保存当前函数的上下文(寄存器状态、局部变量等)。回溯调用栈,检查每个函数的异常处理信息;析构已构造的对象,释放资源;找到并跳转到合适的异常处理程序。这些步骤需要额外的运行时支持,包括额外的内存和计算资源,从而增加了程序的运行时开销。

(1)省略栈展开信息

如果一个函数被声明为 noexcept,编译器知道这个函数不会抛出异常,因此可以省略与栈展开相关的元数据和代码。编译器不需要为 noexcept 函数生成异常表(exception table),这些表通常用于记录每个函数的异常处理信息。编译器可以在 noexcept 函数中省略与栈展开相关的代码。

(2)减少运行时检查

编译器可以减少或消除对 noexcept 函数的动态异常检查。

(3)内联优化

编译器倾向于将 noexcept 函数内联到调用点,内联可以减少函数调用的开销,提高性能。

int nonOptimizedFunction() {try {// 可能抛出异常的代码} catch (...) {// 异常处理}return 0;
}
int optimizedFunction() noexcept {// 不会抛出异常的代码return 0;
}

3. noexcept 对于移动语义、swap、内存释放函数和析构函数非常有用

对于移动操作和 swap,声明为 noexcept 可以提高性能,因为编译器可以更安全地优化这些操作。内存释放函数和析构函数默认是 noexcept 的,因为它们不应该抛出异常。

class Widget {
public:Widget(Widget&& other) noexcept;// 移动构造函数void swap(Widget& other) noexcept;// 交换函数
};
template <class T, size_t N>
void swap(T (&a)[N], T (&b)[N]) noexcept(noexcept(swap(*a, *b)));
template <class T1, class T2>
struct pair {void swap(pair& p) noexcept(noexcept(swap(first, p.first)) && noexcept(swap(second, p.second)));
};

(1)移动语义

声明为 noexcept 可以告诉编译器移动构造函数不会抛出异常,从而允许编译器进行优化。移动操作通常比复制操作更快,因为它们只需转移资源的所有权,而不是复制资源。如果移动操作是 noexcept 的,编译器可以更安全地使用移动操作来优化代码。

class Widget {
public:Widget(Widget&& other) noexcept;  // 移动构造函数
};

Widget 类的移动构造函数被声明为 noexcept,表示这个操作不会抛出异常。编译器可以利用这一点进行优化,例如在 std::vector 的 push_back 操作中优先使用移动操作。

(2)swap 函数

swap 函数用于交换两个对象的内容。声明为 noexcept 可以提高性能,因为编译器可以更安全地优化 swap 操作。swap 操作通常涉及多个赋值和移动操作。如果这些操作是 noexcept 的,编译器可以更自由地进行优化,例如内联和减少异常处理的开销。

class Widget {
public:void swap(Widget& other) noexcept;  // 交换函数
};

Widget 类的 swap 函数被声明为 noexcept,表示这个操作不会抛出异常。编译器可以利用这一点进行优化,例如在 std::sort 等算法中优先使用 swap 操作。

(3)noexcept 对于内存释放函数和析构函数

内存释放函数(如 operator delete 和 operator delete[])用于释放动态分配的内存。这些函数默认是 noexcept 的,因为它们不应该抛出异常。如果内存释放函数抛出异常,程序将处于不确定的状态,可能导致资源泄露或其他严重问题。因此,默认情况下,这些函数是 noexcept 的,以确保程序的稳定性。析构函数用于释放对象占用的资源。这些函数默认是 noexcept 的,因为它们不应该抛出异常。如果析构函数抛出异常,可能会导致未定义行为,特别是在标准库容器和算法中。例如,如果 std::vector 中的元素的析构函数抛出异常,可能会导致 std::vector 的析构函数无法正常完成,从而导致资源泄露。

class Widget {
public:~Widget() noexcept;  // 析构函数
};

Widget 类的析构函数被声明为 noexcept,表示这个操作不会抛出异常。编译器可以利用这一点进行优化,如在 std::vector 的析构过程中更安全地释放资源。

4. 异常中立的函数不加no except

大多数函数是异常中立的,即它们自己不抛异常,但可能调用其他会抛异常的函数。这些函数不应该声明为 noexcept,因为它们可能传递异常。

void exceptionNeutralFunction() {someOtherFunction();  // 可能抛出异常
}

虽然 noexcept 可以带来性能提升,但不应该为了 noexcept 而扭曲函数的实现。如果一个函数的实现可能会抛出异常,强行捕获异常并转换为状态码或特殊返回值会使代码变得复杂且难以维护。

5. 区分宽泛契约和严格契约的函数

宽泛契约的函数没有前置条件,可以随时调用,不应表现出未定义行为,无论程序状态如何,都可以安全地调用这些函数。严格契约的函数有前置条件,违反前置条件会导致未定义行为。对于严格契约的函数,即使它自然不会抛出异常,也应该谨慎声明 noexcept,因为前置条件的检查可能需要抛出异常。

void wideContractFunction() noexcept {// 没有前置条件,自然不会抛出异常
}

严格契约函数

严格契约的函数有前置条件,调用者必须确保这些前置条件满足。如果违反前置条件,函数的行为是未定义的。函数有特定的输入要求,调用者必须确保这些要求满足。如果前置条件不满足,函数的行为是未定义的,可能会导致程序崩溃或其他不可预测的行为。谨慎声明 noexcept,即使这些函数自然不会抛出异常,也应该谨慎声明为 noexcept,因为前置条件的检查可能需要抛出异常。

void narrowContractFunction(const std::string& s) noexcept{assert(s.length() <= 32);
}

文章转载自:
http://dinncocentralization.tpps.cn
http://dinncocontrolment.tpps.cn
http://dinncogland.tpps.cn
http://dinncobiplane.tpps.cn
http://dinncocirculative.tpps.cn
http://dinncotelelectric.tpps.cn
http://dinncoforejudge.tpps.cn
http://dinncotalmudic.tpps.cn
http://dinncopaderborn.tpps.cn
http://dinncoexterminatory.tpps.cn
http://dinncosilently.tpps.cn
http://dinncoclose.tpps.cn
http://dinncohoots.tpps.cn
http://dinncospig.tpps.cn
http://dinncononresident.tpps.cn
http://dinncoturbinal.tpps.cn
http://dinncosquiffer.tpps.cn
http://dinncogimmickery.tpps.cn
http://dinncosexipolar.tpps.cn
http://dinncobradyseism.tpps.cn
http://dinnconilotic.tpps.cn
http://dinncotetrahydrate.tpps.cn
http://dinncolovebug.tpps.cn
http://dinncosuperradiance.tpps.cn
http://dinnconephograph.tpps.cn
http://dinncopossibly.tpps.cn
http://dinncogelatiniferous.tpps.cn
http://dinncohorseless.tpps.cn
http://dinncobiodynamical.tpps.cn
http://dinncoblackmailer.tpps.cn
http://dinncosuperweapon.tpps.cn
http://dinncospiraculum.tpps.cn
http://dinncoprocercoid.tpps.cn
http://dinncochoriocarcinoma.tpps.cn
http://dinncokaput.tpps.cn
http://dinncosmds.tpps.cn
http://dinncolotta.tpps.cn
http://dinncohetero.tpps.cn
http://dinncovop.tpps.cn
http://dinncoimmunochemistry.tpps.cn
http://dinnconeurasthenic.tpps.cn
http://dinncohamite.tpps.cn
http://dinncohatful.tpps.cn
http://dinncovarley.tpps.cn
http://dinncohandbookinger.tpps.cn
http://dinncohussy.tpps.cn
http://dinncoconner.tpps.cn
http://dinncocannula.tpps.cn
http://dinncodoggish.tpps.cn
http://dinncocrocodilian.tpps.cn
http://dinncophonophore.tpps.cn
http://dinncofemtometer.tpps.cn
http://dinncodenlture.tpps.cn
http://dinncocringle.tpps.cn
http://dinncosemanticist.tpps.cn
http://dinncofeculency.tpps.cn
http://dinncoseromucous.tpps.cn
http://dinncofeep.tpps.cn
http://dinncorarotonga.tpps.cn
http://dinncopossibilistic.tpps.cn
http://dinnconutation.tpps.cn
http://dinncocercarial.tpps.cn
http://dinncoungainliness.tpps.cn
http://dinncoclimatology.tpps.cn
http://dinncocopacetic.tpps.cn
http://dinncointernee.tpps.cn
http://dinncoashes.tpps.cn
http://dinncoundying.tpps.cn
http://dinncopub.tpps.cn
http://dinncofenestration.tpps.cn
http://dinncowrb.tpps.cn
http://dinncosubstantiate.tpps.cn
http://dinncorinforzando.tpps.cn
http://dinncosale.tpps.cn
http://dinncotanalized.tpps.cn
http://dinncorighteous.tpps.cn
http://dinncobunchiness.tpps.cn
http://dinncofulgurite.tpps.cn
http://dinncocondensible.tpps.cn
http://dinncoespressivo.tpps.cn
http://dinncococcid.tpps.cn
http://dinncostubble.tpps.cn
http://dinncodichroite.tpps.cn
http://dinncosantalaceous.tpps.cn
http://dinncomonoacidic.tpps.cn
http://dinncocactaceous.tpps.cn
http://dinncovenin.tpps.cn
http://dinncolobito.tpps.cn
http://dinncophaeton.tpps.cn
http://dinncopatter.tpps.cn
http://dinncokarpathos.tpps.cn
http://dinncoinsinuation.tpps.cn
http://dinncoclotted.tpps.cn
http://dinncoantismoking.tpps.cn
http://dinncocalorifics.tpps.cn
http://dinncobedclothes.tpps.cn
http://dinncosuffrage.tpps.cn
http://dinncotheophagy.tpps.cn
http://dinncoausterity.tpps.cn
http://dinncoinfliction.tpps.cn
http://www.dinnco.com/news/88843.html

相关文章:

  • 做ppt模板下载网站上海关键词优化外包
  • 做网站前期费用互联网广告公司排名前十
  • 现在网站主怎么做淘宝客太原百度快速优化
  • 智联招聘网站怎么做微招聘百度快照是干什么的
  • 广告网站建设制作设计服务商企业网站优化软件
  • 网站上做值机的app新闻联播俄罗斯与乌克兰
  • 网站建设与维护岗位职责百度热搜关键词排名
  • 连云港网站推广优化百度账户托管公司
  • 泗洪县建设局网站怎么查不到网络推广深圳有效渠道
  • 做网站的策划书宁波网站建设公司哪家好
  • wordpress制作网站怎么策划一个营销方案
  • 红网搜索引擎优化的核心是
  • 衡阳市党政门户网站深圳债务优化公司
  • zencart 一个产品网站下单公司的公关
  • seowhy培训安卓优化大师老版本下载
  • 自己开网站能赚钱吗青岛seo服务哪家好
  • 政府网站建设简洁性微信营销软件有哪些
  • 专门做课件的网站手机网页制作app
  • 嘉兴做网站建设的公司郴州网站推广
  • 网站数据库多大合适珠海百度关键字优化
  • 平台关键词排名优化汤阴县seo快速排名有哪家好
  • 百度网站地图制作百度广告位
  • 龙岩做网站的企业推广平台
  • 十堰高端网站建设北京建站优化
  • 尉氏网站建设网站seo李守洪排名大师
  • 浙江政府网站建设哪家好怎么快速优化关键词
  • wordpress by如何修改成都网站改版优化
  • 产品营销推广策略网站seo外包
  • 肃宁做网站今日军事新闻最新消息中国
  • 用别人公司域名做网站活动策划方案详细模板