gpt4 book ai didi

c++ - 任何编译器真的会删除这些拷贝吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:23:43 28 4
gpt4 key购买 nike

给定

struct Range{
Range(double from, double to) : from(from), to(to) {}
double from;
double to;
// if it matters to the compiler, we can add more fields here to make copying expensive
};

struct Box{
Box(Range x, Range y) : x(x), y(y) {}
Range x;
Range y;
};

someone saidBox box(Range(0.0,1.0),Range(0.0,2.0)) 中,编译器可以通过在 box 中构造它们来避免完全复制 Range 对象 开始。

真的有编译器这样做吗?

我自己的尝试没有成功。

最佳答案

编译器可以——而且通常会——删除从临时变量到参数的拷贝。编译器不能从传递给成员的参数中删除拷贝。虽然在某些情况下在技术上可以删除这些拷贝,但未获得相关许可。该标准的部分是 12.8 [class.copy] 第 31 段,它阐明了可以省略拷贝的 4 种情况(确切的规则有点不平凡):

  1. 当使用它的名称返回一个命名的函数局部变量时。
  2. throw 表达式中使用命名函数局部变量时。
  3. 复制临时对象时。
  4. 按值捕获异常时。

显然,将命名参数作为参数传递给成员变量的构造不是这些情况。

复制省略规则的基本背景是,在某些情况下,函数声明足以确定何时使用对象。如果在构造时间清楚可以构造对象的位置,则可以将其省略。构造函数的调用者不能仅根据构造函数的声明来确定将在何处使用对象。

关于c++ - 任何编译器真的会删除这些拷贝吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33873047/

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