繁体   English   中英

将变量传递给函数的成本

[英]Cost of passing variables to functions

我不确定函数调用是如何被翻译的,我担心传递的变量会在不需要时被复制到局部变量中。 我可以通过使用全局变量避免不必要的复制,但这不是一个好的解决方案......

1)当目标函数中的变量没有改变时,将它们作为指针,引用或const传递会更好吗?

void fkt1(int i, int j){
  do_something();
  printf("%d", i+j);
}

int main(){
  int i = 5;
  int j = 6;
  fkt1(i, j);
}

2)当变量未在其中使用时将变量传递给函数是否昂贵。 例如,保持一个通用接口,例如:

template <typename T>
void fkt2(T a, T b, int len = -1){ 
  do_something();
  printf("%d", a+b);
}

template<>
void fkt2<char*>(char* a, char* b, int len){
  do_something();
  strcpy(a+len, b);
  printf("%s", a);
}

要么

class base{
public:
  virtual bool calc(int i, int j, int k, int l) = 0;
  base *next1;
  base *next2;
}

class derived1 : public base{
public:
  bool calc(int i, int j, int k, int l){
    return (next1->calc(int i, int j, int k, int l) || 
            next2->calc(int i, int j, int k, int l))
  }
}    

class derived2 : public base{
public:
  bool calc(int i, int j, int k, int l){
    return (return i+j > 5)
  }
}    

class derived3 : public base{
public:
  bool calc(int i, int j, int k, int l){
    return (return j*k < l)
  }
}    

评论非常感谢。

此时不要担心性能问题。

专注于功能的算法成本,而不是琐碎的事情:猜测性能问题是一个坏主意。

如果您确实遇到了性能问题并且具有可维护的代码,那么仍然需要时间来改进它。

现在要真正回答这个问题:

当您必须传递的对象确实不应该被复制时,您可以传递const引用 如果你必须传递整数或简单的结构(也就是小类型),使用const引用甚至指针可能工作太多:如果编译器可能无论如何都会对事物进行优化,那么你将会以非常复杂的方式混乱代码。

有关如何将对象传递给C ++中的函数,请参阅此答案

否则我完全同意ereOn。 首先编写正确,简单且易于维护的代码,并限制应用程序设计和算法的性能考虑。 如果您以后发现性能问题,请先测量,然后尝试改进,然后重新测量。

如果您正在处理复杂类型,如结构或类,那么它取决于复制构造函数。 如果它执行深层复制,那么传递副本可能相当昂贵,您应该使用引用或指针。 即使您只进行浅层复制,使用引用也可能会带来很小的性能优势,但它最多只是最小的。

一般来说,这没关系 ; 重要的是在函数中做了什么,以及以某种方式传递参数的成本是可以忽略的。 将参数作为副本,指针或引用传递应取决于您需要对该参数执行的操作,而不是更快。

由于缓存局部性,全局变量实际上可能会损害性能。 但是你应该避免它们只是因为它们是全局变量,尽管有性能。

1)如果函数中的变量没有改变,那么在C ++中将它们作为const引用传递。 在C中只传递值,因此原始参数不能更改。 这是为了良好的编程实践,而不是性能。

2)传递一个未使用的变量仍然需要使用它来构建调用堆栈。 但是,许多处理器都具有仅在寄存器中传递参数的调用约定。 让编译器进行优化; 它很擅长。

考虑到当今的处理器速度和编译器功能,您正在考虑的性能问题是微不足道的。 不要基于性能恐惧来设计具有参数约束的代码。 它只会降低您的设计质量。

现在函数调用(包括参数传递)的成本相对较低。 如果您在函数中有任何其他复杂的任务(例如printf等),则此成本可以忽略不计。

为了获得最佳效果,您可以尝试在包含文件中保存函数定义,并使用inline标记它们。 这在C ++和C99中受支持,并且应该在大多数常见情况下尽可能地发挥作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM