Void vs Int输出参数签名

时间:2013-08-07 02:35:38

标签: c++ optimization memory-management

我可以编写一个简单的函数来使用函数两种方式添加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 查看符号时。我注意到两者之间的差异很小。实际上,假设 LEA MOV 具有相同数量的执行周期,则第二代码具有一个指令较小。使用第一种编码方式与第二种方式相比,是否有一些优势?也许,反之亦然。

我在stackexchange中搜索了这个问题并找到了这个(Void vs Int Functions),但这并没有解释。

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分:1)

第一种风格,主要用于对象(复制操作很昂贵),并且可能带有(N)RVO的编译器有助于避免深度对象复制

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

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