Void与Int输出参数签名



我可以用两种方法编写一个简单的函数来添加2个数字。其中一个使用void输出函数签名,另一个使用int输出函数签名。我注意到第一个更常用于程序员。

这是的第一个代码

#include<iostream>
void add(int x, int y, int* z)
{
  z[0] = x + y;
}
int main()
{
  int a = 5;
  int b = 10;
  int c = 0;
  add(a, b, &c);
  return 0;
}

这是的第二个代码

#include<iostream>
int add(int x, int y)
{
  int z;
  z = x + y;
  return z;
}
int main()
{
  int a = 5;
  int b = 10;
  int c;
  c = add(a, b);
  return 0;
}

当我使用gcc编译代码并使用objdump查看符号时。我注意到两者之间的细微差别。事实上,假设LEAMOV具有相同数量的执行周期,第二个代码的指令要少一个。使用第一种编码方式与使用第二种编码方式相比是否有一些优势?也许,反之亦然。

我在stackexchange上搜索了这个问题,发现了这个(Void vs Int函数),但这并不能解释。

我不确定为什么你认为第一个更常用,第二个更可能是因为它允许你链接表达式,比如:

int xyzzy = add (42, 18) / add (15, 15);

void变体就不那么优雅了

int xyzzy;
add (42, 18, &xyzzy);
{
    int temp;
    add (15, 15, &temp);
    xyzzy /= temp;
}

在任何情况下,当C++提供了一种非常好的传递引用变量的方法时,真正的C++程序员(与声称是C++程序员的C程序员相反)都不会使用指针进行传递引用:

void add(int x, int y, int& z) // or even && for C++11.

第一种样式主要用于较重的对象(复制操作成本高昂),并且可能有编译器不带(N)RVO,这有助于消除深度对象复制。

实际上,正如您所知,C++程序员更喜欢第二种风格,因为它看起来(和行为)很自然:函数接受一些输入参数,并产生唯一的结果作为返回。

有了C++11和可移动对象,第一种风格的必要性几乎为零,因此几乎所有函数都可以用自然的方式编写。

最新更新