diff --git a/Languages/cpp/关于语法疑问.txt b/Languages/cpp/关于语法疑问.txt index fdf90e3..9818cb2 100644 --- a/Languages/cpp/关于语法疑问.txt +++ b/Languages/cpp/关于语法疑问.txt @@ -1,4 +1,12 @@ 【1】函数直接返回一个栈上面的对象,是会调用移动构造还是复制构造?? 实际测试=> (1)在MSVC中,不开优化时调用移动构造,开启优化时,编译器直接在返回值位置构造对象,避免拷贝/移动。 -称为NRVO优化 [NRVO​ 是 Named Return Value Optimization​ 的缩写,意思是 "命名返回值优化"。]。因为在函数中,返回的是一个有名字的局部变量。 \ No newline at end of file +称为NRVO优化 [NRVO​ 是 Named Return Value Optimization​ 的缩写,意思是 "命名返回值优化"。]。因为在函数中,返回的是一个有名字的局部变量。 + +【2】noexcept干嘛的? +用于优化。 +很多标准库容器(如 std::vector)操作在重新分配内存时,会根据移动操作的 noexcept决定策略。 +即检查移动操作是否是 noexcept来选择"移动还是拷贝"。 +比如std::vector,在扩容时,默认调用ClassA的拷贝构造函数,因为假如默认移动构造,移动到某个位置突然异常了,这时候没法“复原”数据, +因为移动,原容器不能用了,又因为没有移动完,移动后的也不能用,只能终止。但用户意愿可能需要可以恢复,所以默认不调用移动构造。 +如果用户明确表明了noexcept,那么表示可以接受如果移动失败终止的结果。 \ No newline at end of file