2013-02-26 44 views
2

考虑在C++中使用按指针传递的交换函数的简单测试。为什么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++确实没有任何真正的优势?

+6

参考**是**指针,他们只是*看*不同。尽管如此,它们在底下没什么不同。 (除了它们不能为空) – Mehrdad 2013-02-26 05:42:32

+0

@Mehrdad那么我的假设是正确的,除了使代码更整洁外,没有其他功能。 – Leonardo 2013-02-26 05:43:28

+3

不仅整洁,而且更安全,因为引用不能像指针那样是NULL。但是,在编译时引用和指针通常会生成相同的机器代码。 – 2013-02-26 05:44:51

回答

1

只有这样,才能确保将检查代码的每个生成的编译器和比较两个,看看你会得到什么。

这么说,我自己也有点惊讶地看到一个真正的区别(至少在启用优化),至少在相当主流的编译器。你可能看到在一个非常小的嵌入式系统上的编译器的差异,在过去的十年中还没有被更新,但即使在那里它也不太可能。

我还要补充一点,在我希望看到代码内联产生这样一个微不足道的功能大多数情况下,所以是在函数调用或参数传递在所有涉及。在一个典型的案例中,它很可能只归结为几个加载和存储。

1

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

在设计上,C没有抽象为C++的相当尽可能多的水平。

相关问题