Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
函数使用指向集合的指针以避免返回时复制的优点? 假设我有以下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); //返回一个包含{1!、2!、…、n!}的集。 设置GetFactorials(int n){ 设置ret; int curr=1; 对于(int i=1;i_C++_Pointers_Reference - Fatal编程技术网

函数使用指向集合的指针以避免返回时复制的优点? 假设我有以下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); //返回一个包含{1!、2!、…、n!}的集。 设置GetFactorials(int n){ 设置ret; int curr=1; 对于(int i=1;i

函数使用指向集合的指针以避免返回时复制的优点? 假设我有以下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); //返回一个包含{1!、2!、…、n!}的集。 设置GetFactorials(int n){ 设置ret; int curr=1; 对于(int i=1;i,c++,pointers,reference,C++,Pointers,Reference,(这只是一个伪示例。关键是函数本身创建集并返回它。) 我的一个朋友告诉我,我不应该像以前那样编写函数,而是应该编写函数,使函数接收指向集合的指针,以避免在返回时复制集合。我猜他的意思是: void GetFactorials2(int n, set<int>* fs) { int curr = 1; for (int i = 1; i < n; i++) { curr *= i; fs->insert(curr); } } set<in

(这只是一个伪示例。关键是函数本身创建集并返回它。)

我的一个朋友告诉我,我不应该像以前那样编写函数,而是应该编写函数,使函数接收指向集合的指针,以避免在返回时复制集合。我猜他的意思是:

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);
void GetFactorials2(int n,set*fs){
int curr=1;
对于(int i=1;i插入(当前);
}
}
设置fs;
GetFactorials2(5,&fs);

我的问题:第二种方式真的是一个很大的优势吗?我觉得很奇怪。我是C++新手,对编译器不太了解,但我想通过编译器魔法,我的原始函数不会那么贵。(而且我可以避免自己初始化设置。)我错了吗?要理解这一点,我应该了解指针和返回时的复制吗?

是的,这可能会很昂贵。尤其是当布景变大的时候。这里没有理由不使用指针或引用。它将为您节省很多,并且您不会在可读性方面牺牲太多

既然你可以自己优化,为什么还要依赖于编译器优化呢。编译器知道您的代码,但并不总是理解您的算法

我会这么做

void GetFactorials2(int n, set<int>& fs) {
//                                   ^^
  int curr = 1;
  for (int i = 1; i < n; i++) {
    curr *= i;
    fs->insert(curr);
  }
}
void GetFactorials2(int n,set&fs){
//                                   ^^
int curr=1;
对于(int i=1;i插入(当前);
}
}
电话会保持正常

set<int> fs;
GetFactorials2(5, fs);
                  ^^ 
set-fs;
GetFactorials2(5,fs);
^^ 

是的,可能很贵。尤其是当布景变大的时候。这里没有理由不使用指针或引用。它将为您节省很多,并且您不会在可读性方面牺牲太多

既然你可以自己优化,为什么还要依赖于编译器优化呢。编译器知道您的代码,但并不总是理解您的算法

我会这么做

void GetFactorials2(int n, set<int>& fs) {
//                                   ^^
  int curr = 1;
  for (int i = 1; i < n; i++) {
    curr *= i;
    fs->insert(curr);
  }
}
void GetFactorials2(int n,set&fs){
//                                   ^^
int curr=1;
对于(int i=1;i插入(当前);
}
}
电话会保持正常

set<int> fs;
GetFactorials2(5, fs);
                  ^^ 
set-fs;
GetFactorials2(5,fs);
^^ 

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


如果你真的想深入细节,请阅读Dave Abrahams(boost的主要贡献者之一)的文章。不过,长话短说,只需返回值即可。它可能更快。

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


如果你真的想深入细节,请阅读Dave Abrahams(boost的主要贡献者之一)的文章。不过,长话短说,只需返回值即可。它可能更快。

谷歌搜索RVO和NRVO。对于记录,除非集合或列表类实现了深度副本,否则指针或引用与值传递之间的差异将非常小,并且大小将固定。谷歌搜索RVO和NRVO。对于记录,除非集合或列表类实现了深度副本,否则指针或引用与值传递之间的差异将非常小,并且在大小上是固定的。代码更难看,引用透明度损失,调用站点需要额外的代码,在99%的情况下没有任何好处。@Yuushi调用站点的额外调用?你是说额外的
fs
?你愿意依靠编译器优化来不写它吗?如果调用函数时集合不是空的,你就引入了一个潜在的错误:P。我想这只是味道的问题,但我觉得它可读性较差,并且(可能)需要更多的检查,也许,最后,甚至可能比您只编写代码来完成您的任务,而不是试图解决不存在的问题慢几纳秒。@Yuushi and to be complete ROV是一个相对较新的优化。它甚至不是在所有编译器上都可用。我宁愿正确地编写一个合适的代码,也不愿意让它去做,希望编译器能对它进行优化。这是一个相对较新的优化,由Walter Bright在1991年实现。这完全属于过早优化的阵营,因此97%可能是邪恶的,正如俗话所说……更丑陋的代码,失去引用透明度,调用站点需要额外的代码,在99%的情况下没有任何好处。@Yuushi调用站点的额外调用?你是说额外的
fs
?你愿意依靠编译器优化来不写它吗?如果调用函数时集合不是空的,你就引入了一个潜在的错误:P。我想这只是味道的问题,但我觉得它可读性较差,并且(可能)需要更多的检查,也许,最后,甚至可能比您只编写代码来完成您的任务,而不是试图解决不存在的问题慢几纳秒。@Yuushi and to be complete ROV是一个相对较新的优化。它甚至不是在所有编译器上都可用。我宁愿正确地编写一个合适的代码,也不愿意让它去做,希望编译器能对它进行优化。这是一个相对较新的优化,由Walter Bright在1991年实现。这完全属于过早优化的阵营,因此97%的可能性是邪恶的,正如俗话所说。。。