【发布时间】:2013-02-26 05:40:44
【问题描述】:
考虑在 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;
}
这个程序是否比我通过地址传递使用更多的内存?比如在这个函数中声明:
void swap_ints(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
return;
}
这个 C++ 函数的传递引用版本是否使用更少的内存,不需要创建指针变量?
C 不是和 C++ 一样具有这种“按引用传递”的能力吗?如果是这样,那为什么不呢,因为这意味着内存效率更高的代码,对吧?如果不是,那么 C 不采用这种能力的原因是什么。我想我没有考虑的是 C++ 可能会创建指针以在幕后实现此功能。这就是编译器实际上所做的——所以除了更简洁的代码之外,C++ 真的没有任何真正的优势吗?
【问题讨论】:
-
引用是指针,它们只是看起来不同。不过,它们在下面没有什么不同。 (除了它们不能为空。)
-
@Mehrdad 那么我的假设是正确的,除了让代码更整洁之外没有其他功能。
-
不仅整洁,而且更安全,因为引用不能像指针那样为 NULL。但实际上,引用和指针在编译时通常会产生相同的机器代码。
-
“引用不能为空”是一个谬论。它的真正含义是,正式地,当您“传递空引用”时未定义的行为是在函数调用而不是在函数内部的某个位置调用的,但无论哪种方式,这都是以某种方式违反接口契约的问题最终导致未定义的行为。在实现(生成的机器代码)方面,完全相同的事情无论是指针还是引用都会发生。
-
这是个人意见,虽然传递引用非常方便,但在某些方面我更喜欢 C 的仅指针方法。在调用函数时必须显式传入一个指针,并在函数体中显式取消引用它,有效地防止您忘记您正在通过引用传递一个变量(因此它可能会被修改),同样可以防止您无意中编写函数中的代码会在您不打算修改某些内容时进行修改。尽管可以通过在参数中添加
const修饰符来防止后者。
标签: c++ c memory-efficient