0

我可以编写一个简单的函数来使用函数两种方式添加 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 Functions),但这并不能解释。

4

2 回答 2

2

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

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.
于 2013-08-07T02:54:38.860 回答
1

第一种样式主要用于(用于)对象(复制操作昂贵),并且可能使用不带 (N)RVO 的编译器,这有助于避免深度对象复制。

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

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

于 2013-08-07T02:52:40.277 回答