函数接受一个指向集合的指针的优点,以避免在返回时复制
Advantage of function taking a pointer to a collection, to avoid copying on return?
假设我有以下c++函数:
// Returns a set containing {1!, 2!, ..., n!}.
set<int> GetFactorials(int n) {
set<int> ret;
int curr = 1;
for (int i = 1; i < n; i++) {
curr *= i;
ret.insert(curr);
}
return ret;
}
set<int> fs = GetFactorials(5);
(这只是一个假的例子。关键是函数自己创建集合并返回它。)
我的一个朋友告诉我,与其按照我的方式编写函数,不如让函数接受一个指向集合的指针,以避免在返回时复制集合。我猜他的意思是:
void GetFactorials2(int n, set<int>* fs) {
int curr = 1;
for (int i = 1; i < n; i++) {
curr *= i;
fs->insert(curr);
}
}
set<int> fs;
GetFactorials2(5, &fs);
我的问题是:第二种方法真的有很大的优势吗?我觉得很奇怪。我是c++新手,对编译器了解不多,但我认为通过一些编译器的魔法,我的原始函数不会那么昂贵。(这样我就不用自己初始化集合了。)我错了吗?关于指针和返回时复制,我应该知道些什么才能理解这个? 不,这通常是不有利的。如今,几乎所有合理的编译器都会利用命名返回值优化(见这里)。这有效地消除了前一个示例的任何性能损失。
如果您真的想了解细节,请阅读Dave Abrahams (boost的主要贡献者之一)的这篇文章。长话短说,但是,只是返回值。这样可能更快。
是的,它可能很昂贵。尤其是当布景变大的时候。这里没有理由不使用指针或引用。它将为您节省很多,并且您不会在可读性方面牺牲太多。
当你可以自己优化时,为什么要依赖编译器优化呢?编译器知道你的代码,但并不总是理解你的算法。
我会这样做
void GetFactorials2(int n, set<int>& fs) {
// ^^
int curr = 1;
for (int i = 1; i < n; i++) {
curr *= i;
fs->insert(curr);
}
}
,通话将保持正常。
set<int> fs;
GetFactorials2(5, fs);
^^
相关文章:
- 为什么当我尝试返回引用时,我的对象仍然被复制
- 如何返回/复制unique_ptr<无符号字符[]>的值?
- 像 std::list<std::p air<string, string>> 这样的结构在返回时会被复制吗?
- 使用 sftp_open() 使用 C++ 中的 SFTP libssh 将文件从本地复制到远程时,File 返回 N
- 如何将不可移动和不可复制的函数返回值获取到数组中
- 阻止在返回时复制共享指针
- 函数返回时,带指针的复制构造函数失败
- 复制构造函数 C++ 在析构函数上返回奇怪的字母
- 将参数的省略复制为返回值
- 为什么我的类工作正常,即使在返回垃圾值作为赋值运算符和空复制构造函数的返回之后
- 如何让"factory function"返回不可复制的对象?
- 为什么返回std::optional有时移动,有时复制
- 复制构造函数、按值传递和按值返回、链式操作、编译器
- 复制省略并在返回值中移动语义
- C 标准:通过复制返回以初始化无RVO的参考:是否有任何副本
- 允许移动和复制返回的班级成员
- 通过复制返回局部变量 - 它是如何工作的
- 强制移动而不是复制返回的常量值
- c++中的函数如何以最小的复制返回值或引用?
- 是一个函数,用于转换复制返回值的对象