c++ - 函数采用指向集合的指针的优点,以避免在返回时复制?

标签 c++ pointers reference

假设我有以下 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);

(这只是一个虚拟示例。关键是函数自己创建集合并返回它。)

我的一个 friend 告诉我,与其像我那样编写函数,不如让函数接受一个指向集合的指针,以避免在返回时复制集合。我猜他的意思是:

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++ 的新手,对编译器知之甚少,但我认为通过一些编译器魔法,我的原始函数不会那么昂贵。 (而且我可以避免自己初始化设置。)我错了吗?我应该了解有关指针和返回复制的哪些知识才能理解这一点?

最佳答案

不,它通常根本没有优势。现在几乎所有合理的编译器都会使用命名返回值优化(参见 here )。这有效地消除了前一个示例中的任何性能损失。

如果你真的想深入了解细节,请阅读 this article由 Dave Abrahams(插入的主要贡献者之一)撰写。然而,长话短说,只是返回值。它可能更快。

关于c++ - 函数采用指向集合的指针的优点,以避免在返回时复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16007662/

相关文章:

c++ - 转换为无效*

Java : Assume object reference or make copy

css - Handlebars NodeJS/Koa 脚本/Src 引用

c++ - 将一个常数乘以一个复数 & 运算符重载问题

c++ - g++4.8 对 gdb 隐藏变量

android - 使用 FFmpeg 捕获视频流

pointers - 使用嵌套结构指针断言接口(interface)

c++ - operator->智能指针的返回值

google-sheets - 公式中的范围引用在一种情况下发生变化,但在另一种情况下不变

c++ - 关于 gcc 3.3.4 内存核心转储的问题