Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我们需要设置move constructor=default吗?对于过去使用C++98/03使用用户声明的析构函数构建集的遗留类? 问题是,让我们考虑过去C++中的一个大的遗留项目总是为C++ 98/03标准构建的。_C++_C++11 - Fatal编程技术网

我们需要设置move constructor=default吗?对于过去使用C++98/03使用用户声明的析构函数构建集的遗留类? 问题是,让我们考虑过去C++中的一个大的遗留项目总是为C++ 98/03标准构建的。

我们需要设置move constructor=default吗?对于过去使用C++98/03使用用户声明的析构函数构建集的遗留类? 问题是,让我们考虑过去C++中的一个大的遗留项目总是为C++ 98/03标准构建的。,c++,c++11,C++,C++11,项目遵循了,因此项目中有很多用户定义的析构函数 如果现在项目是为标准C++11/14/17构建的,那么手动设置move constructor=default是一个好主意吗 由于Howard Hinnant在Accu_2014上展示的幻灯片,这些类不会自动提供移动构造函数。 因此,问题是,通过为每个类设置move constructor=default,项目能否在性能方面受益 更准确地说,假设在设置move constructor=default之后,应用程序的运行与以前完全相同,所有单元测试

项目遵循了,因此项目中有很多用户定义的析构函数

如果现在项目是为标准C++11/14/17构建的,那么手动设置move constructor=default是一个好主意吗

由于Howard Hinnant在Accu_2014上展示的幻灯片,这些类不会自动提供移动构造函数。

因此,问题是,通过为每个类设置move constructor=default,项目能否在性能方面受益

更准确地说,假设在设置move constructor=default之后,应用程序的运行与以前完全相同,所有单元测试工作与以前一样

您认为定义move constructor=default会带来性能方面的好处吗

塔克斯

您认为定义move constructor=default会带来性能方面的好处吗

如果不研究代码库并运行一些基准测试,就不可能预测到这一点。令人遗憾的是,这可能会对您的运行时性能产生积极影响。拥有一个=默认移动构造函数和移动赋值操作符,并且假设它们做正确的事情,这绝不是一种悲观。可能发生的最糟糕的事情是,您的数据成员没有从移动构造中受益,例如,您有一个std::array数据成员,然后您将执行与以前相同的复制

这个项目遵循三个原则

当您更新代码时,这会导致一致性问题。在C++11中,三的规则现在是五的规则。因此,如果到目前为止一直遵循三个规则,那么除了可能获得的运行时性能优势外,还应该迁移到五个规则以保持一致

手动设置move constructor=default是个好主意吗

不,用叮当当当的支票让工具对着你尖叫

您认为定义move constructor=default会带来性能方面的好处吗

如果不研究代码库并运行一些基准测试,就不可能预测到这一点。令人遗憾的是,这可能会对您的运行时性能产生积极影响。拥有一个=默认移动构造函数和移动赋值操作符,并且假设它们做正确的事情,这绝不是一种悲观。可能发生的最糟糕的事情是,您的数据成员没有从移动构造中受益,例如,您有一个std::array数据成员,然后您将执行与以前相同的复制

这个项目遵循三个原则

当您更新代码时,这会导致一致性问题。在C++11中,三的规则现在是五的规则。因此,如果到目前为止一直遵循三个规则,那么除了可能获得的运行时性能优势外,还应该迁移到五个规则以保持一致

手动设置move constructor=default是个好主意吗


不。使用clang tidy的检查让工具对着你尖叫。

如果有用户定义的析构函数,默认移动构造函数和默认构造函数可能是错误的,这就是为什么在这种情况下删除移动,复制不是历史性的:,正如你可能在表中注意到的,这些用例是红色的,理想情况下,它们应该像移动一样被删除

所以=默认值可能是错误的,您可能需要自定义一个。但是如果默认值符合您的需要,那么您可以添加默认值以替换某些可能的移动复制


否则,您可能仍然会编写相关的用户提供的移动构造函数。

如果存在用户定义的析构函数,则默认移动构造函数和默认构造函数可能是错误的,这就是为什么在这种情况下删除了移动,复制不是历史性的:,正如您在表中可能注意到的,这些情况下是红色的,理想情况下,对于移动,应将其删除

所以=默认值可能是错误的,您可能需要自定义一个。但是如果默认值符合您的需要,那么您可以添加默认值以替换某些可能的移动复制

否则,您仍然可以编写相关的用户提供的移动构造函数