2

考虑使用指针传递的 C++ 中这个交换函数的简单测试。

#include <iostream>

using std::cout;
using std::endl;

void swap_ints(int *a, int *b)
{
   int temp = *a;
   *a = *b;
   *b = temp;
   return;
}

int main(void)
{
   int a = 1;
   int b = 0;
   cout << "a = " << a << "\t" << "b = " << b << "\n\n";
   swap_ints(&a, &b);
   cout << "a = " << a << "\t" << "b = " << b << endl;

   return 0;
}

这个程序是否比我按地址传递时使用更多的内存?比如在这个函数 decleration 中:

void swap_ints(int &a, int &b)
{
   int temp = a;
   a = b;
   b = temp;
   return;
}

通过不需要创建指针变量,这个 C++ 函数的按引用传递版本是否使用更少的内存?

并且 C 不具有与 C++ 相同的“按引用传递”能力吗?如果是这样,那为什么不呢,因为这意味着内存效率更高的代码,对吧?如果不是,那么 C 不采用这种能力的原因是什么。我想我没有考虑的是 C++ 可能会创建指针以在幕后实现此功能。这就是编译器实际上所做的——所以除了更简洁的代码之外,C++ 真的没有任何真正的优势吗?

4

2 回答 2

1

唯一可以确定的方法是检查编译器为每个生成的代码并比较两者以查看您得到的结果。

也就是说,看到真正的差异(至少在启用优化时)我会有点惊讶,至少对于一个相当主流的编译器来说是这样。您可能会在一些非常小的嵌入式系统上看到编译器的差异,这些系统在过去十年左右没有更新,但即使在那里,老实说也不太可能。

我还应该补充一点,在大多数情况下,我希望看到这样一个内联生成的微不足道的函数的代码,所以根本就涉及函数调用或参数传递。在一个典型的情况下,它很可能归结为几个加载和存储。

于 2013-02-26T05:44:20.950 回答
1

不要将代码中的变量计数与处理器使用的内存计数混淆。C++ 有许多抽象隐藏了编译器的内部工作,以使事情变得更简单、更容易让人理解。

按照设计,C 没有 C++ 那么多的抽象级别。

于 2013-02-26T05:46:54.477 回答