当前位置: 首页 > 编程笔记 >

C++ 复制删除的目的

长孙景焕
2023-03-14
本文向大家介绍C++ 复制删除的目的,包括了C++ 复制删除的目的的使用技巧和注意事项,需要的朋友参考一下

示例

在标准中,有一些地方可以复制或移动对象以初始化对象。复制省略(有时称为返回值优化)是一种优化,通过该优化,在某些特定情况下,即使标准规定必须进行复制,也允许编译器避免复制或移动。

考虑以下功能:

std::string get_string()
{
  return std::string("我是绳子。");
}

根据标准的严格措辞,此函数将初始化一个临时std::string对象,然后将其复制/移动到返回值对象中,然后销毁该临时对象。该标准非常清楚,这就是解释代码的方式。

复制省略是一条规则,它允许C ++编译器忽略临时文件的创建及其后续的复制/销毁。也就是说,编译器可以为临时变量获取初始化表达式,然后直接从中初始化函数的返回值。这显然可以节省性能。

但是,它确实对用户有两个明显的影响:

  1. 该类型必须具有将被调用的复制/移动构造函数。即使编译器取消复制/移动,该类型仍必须能够被复制/移动。

  2. 在可能发生省略的情况下,不能保证复制/移动构造函数的副作用。考虑以下:

json="[{"Type":"GreaterThanOrEqual","GroupName":null,"VersionName":"C++11"}]"> C ++ 11
struct my_type
{
  my_type() = default;
  my_type(const my_type &) {std::cout <<"Copying\n";}
  my_type(my_type &&) {std::cout <<"Moving\n";}
};

my_type func()
{
  return my_type();
}

电话会func做什么?好吧,它永远不会打印“正在复制”,因为临时是一个右值并且my_type是可移动的类型。那么它会打印“ Moving”吗?

如果没有复制省略规则,则必须始终打印“ Moving”(移动)。但是,由于存在复制省略规则,因此可以调用或可以不调用move构造函数;它取决于实现。

因此,在可能省略的上下文中,您不能依赖于复制/移动构造函数的调用。

因为省略是一种优化,所以您的编译器可能并不在所有情况下都支持省略。而且,无论编译器是否忽略特定情况,类型都必须仍然支持被忽略的操作。因此,如果省略了复制构造,则该类型仍必须具有一个复制构造函数,即使不会被调用。

 类似资料:
  • 本文向大家介绍C# 复制与删除文件的实现方法,包括了C# 复制与删除文件的实现方法的使用技巧和注意事项,需要的朋友参考一下 C# 复制与删除文件的实现方法 1、首先是复制文件 首先打开我们的对话框获得文件路径,当然也可以直接编写路径 然后是复制文件的方法买这里我写的是添加,是根据我的项目来的 MyFile是一个文件操作类,OpenFileDialog需要添加引用 string[] s = path

  • 问题内容: 我想从下表中删除多个重复的键: 希望它像 我正在使用mysql。这是可能的吗?我不能使用 查询来进行唯一的输入,因为我希望将这些重复的输入输入到表中。 问题答案: 一种方法是使用将表联接到子查询上。子查询得到最低为每。当记录在子查询上不匹配时,仅表示它没有匹配的记录并且可以安全地删除。 SQLFiddle演示 但是,如果的记录可以具有不同的名称,则您需要在子句中包括它们,否则将仅保留最

  • 问题内容: 我必须向现有表添加唯一约束。很好,除了表已经有数百万行,而且许多行违反了我需要添加的唯一约束。 删除有问题的行的最快方法是什么?我有一条SQL语句,该语句查找重复项并将其删除,但要花很长时间才能运行。有没有其他方法可以解决此问题?也许备份表,然后在添加约束后还原表? 问题答案: 其中一些方法似乎有些复杂,我通常这样做是: 给定table table,要在()上对其进行唯一化,使行保持为

  • 问题内容: 我有一张有几千行的表。该表包含两列,和。我有几个重复的行,例如: John Smith | john@smith.com JJohn Smith | john@smith.com JErica Smith | erica@smith.com JErica Smith | erica@smith.com 删除所有重复结果的最简单方法是什么。例如,使表的内容为= 。 问题答案: 您可以很容

  • 问题内容: 如何从没有主键的表中检测/删除数据库中的重复条目? [如果我们使用“ DISTINCT”,我们如何知道哪一条记录是正确的并重复一条记录?] 问题答案:

  • 本文向大家介绍java文件和目录的增删复制,包括了java文件和目录的增删复制的使用技巧和注意事项,需要的朋友参考一下 在使用java进行开发时常常会用到文件和目录的增删复制等方法。我写了一个小工具类。和大家分享,希望大家指正: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。