2013-02-26 43 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++的相當儘可能多的水平。

相關問題