【发布时间】:2013-04-29 17:30:11
【问题描述】:
我在多个来源中读到 C++ 引用只不过是一个具有编译时间限制的指针。
如果这是真的,为什么我不得不取消引用指针以便将它传递给需要参数的函数?
void FooRef(const int&);
void FooPointer(const int*);
int main()
{
int* p = new int(5);
FooPointer(p);
FooRef(*p); // why do I have to dereference the pointer?
...
}
据我了解,如果我要将 int 传递给 FooRef,编译器将为我从变量的地址创建指针(引用),但如果类型已经是指针,则取消引用它似乎毫无意义。在我看来,我正在取消引用一个指针,只是为了让编译器从取消引用的值创建另一个指针,这对我来说似乎毫无意义。
仅仅复制指针而不是仅仅引用+引用值不是更简单/更高效吗? (也许这真的是正在发生的事情?)
我在这里遗漏了什么吗?在这种情况下调用FooRef 是否比调用FooPointer 慢?
并且在编译过程中引用和指针真的会产生相同的代码吗?
【问题讨论】:
-
引用更像是 IMO 的别名 - 对象的另一个名称。有时它可能由指针实现(并不总是必要的,在某些情况下编译器可能会用它代替原始名称)。
-
这里的解引用操作无非是语法糖。你必须写一个解引用,但实际上没有执行。
-
请注意,您可以拨打
FooRef(5);,但不能拨打FooPointer(&5);。 -
另一个例子:
int a = 42; int& b = a; b = 33;还不如优化成int a = 42; a = 33; -
@Acidic:不,语言不保证这一点。就语言规范而言,每当您取消引用指针时,编译器编写者可以决定在您的代码中放置 10 分钟的睡眠,这将是一个有效的决定。你只需要相信编译器作者不是白痴,或者自己检查代码输出。