- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我是 C++ 的新手,我对一些关于复制的 C++ 约定有疑问。我在谷歌上四处搜索,并没有真正找到好的指导,所以我求助于你们这些好人。
假设您有一个对象,代表某种技术上可复制的资源,但复制成本很高,而且几乎总是错误的做法。你还应该为它实现一个复制构造函数吗?还是创建一个类似 make_copy()
的成员函数更好(对于那些您确实想要复制对象的罕见情况)。
例如:假设您有一个表示存储在显存中的纹理的类。该资源在技术上是可复制的:您可以为其创建一个新句柄并复制内存(通过 CPU 或使用图形库调用)。但一般来说,这不是你真正想经常做的事情。它很昂贵,而且通常是错误的做法,并且可能非常浪费内存。但是,您可以想象有意义的极端情况:截取屏幕截图并在其上应用过滤器或其他东西。这些情况很少见,但它们会存在。
我之所以犹豫要不要制作一个复制构造函数来执行此操作,是因为我觉得 C++ 有点太急于复制东西了。也许它反射(reflect)了我对这门语言有点陌生的事实,但由于 C++ 会在各种情况下调用复制构造函数,而您可能并不打算这样做。喜欢:
void some_method(Texture t)
{
...
}
Texture t(<arguments>);
Texture t2 = t; // calls copy constructor
some_method(t2); // calls copy constructor
我宁愿调用复制构造函数的这两行是编译器错误(因为我觉得它们很容易犯错误),如果你想真正制作一个拷贝,你需要非常明确地说明它并且使用专用的成员函数。
关于这个有一些标准的做法吗?关于何时应该(和不应该)编写复制构造函数的一些明智建议?我错过了一些 Scott Meyers 的章节?还是只要有可能我就应该这样做?
编辑:为了清楚说明我的示例:显然,您应该通过引用传递参数,但我的观点是这是一个很容易犯的错误,只是漏掉了 & 符号。如果你这样做,编译器会很乐意用非常昂贵的拷贝替换便宜的按引用传递,我宁愿编译器不这样做。但我不知道,也许这不是人们通常在 C++ 中犯的错误,我过于谨慎了?
最佳答案
是否要使用它是您的决定,但这里有一个语法相对简单的模式:
struct ExplicitCopy {
// Implement as usual
ExplicitCopy() = default;
ExplicitCopy(ExplicitCopy &&) = default;
ExplicitCopy &operator = (ExplicitCopy &&) = default;
// Copying happens with an ADL call to this function
friend ExplicitCopy copy(ExplicitCopy const &orig) {
return orig;
}
private:
// Copy operations are private and can't be called accidentally
ExplicitCopy(ExplicitCopy const &) = default;
ExplicitCopy &operator = (ExplicitCopy const &) = default;
};
然后,尝试复制实例将导致调用私有(private)构造函数时出现编译器错误。
ExplicitCopy ec;
ExplicitCopy ec2 = ec; // Nope
ExplicitCopy ec3(ec); // Nope
ExplicitCopy ec4 = copy(ec); // Yes
由于复制省略,没有额外的构造函数调用。
关于c++ - 在 C++ 中,如果复制一个对象是可能的,但确实很昂贵而且通常不是一个好主意,您是否仍然应该使用复制构造函数来实现复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53170207/
我正在阅读 MongoDB,并试图了解它的最佳用途。我没有看到明确答案的一个问题是哪些操作便宜或昂贵,以及在什么条件下。 你能帮忙澄清一下吗? 谢谢。 最佳答案 人们经常声称 mongodb 的写入速
我正在寻找一个主要来源(或一个非常好的解释)来支持在为 iPhone 编写软件时使用 autorelease 是危险的或过于昂贵的说法。 许多开发者都提出了这种说法,我什至听说 Apple 不推荐它,
我意识到这离微优化领域太远了,但我很想知道为什么调用 DateTime.Now 和 DateTime.UtcNow 如此“昂贵”。我有一个示例程序,它运行几个场景来做一些“工作”(添加到一个计数器)并
我是一名优秀的程序员,十分优秀!