我可以编写一个简单的函数来使用函数两种方式添加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),但这并没有解释。
答案 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和第一种风格所需的可移动对象几乎为零,因此几乎所有函数都可以用自然的方式编写。