GUID 按引用傳遞

在學com時遇到引用傳遞GUID,GUID值佔用了16個字節,可以理解爲抽象類型,因此一般不直接傳遞GUID參數,而是使用引用傳遞,eg:const IID&,可以參考下c++按引用傳遞C++中的函數有會採用按引用的參數傳遞和返回。比如:

    int&f(int& a){
       a++;
       return a;
    }


“按引用進行參數傳遞”很好理解:
     通常使用的“按指傳遞”,函數內的操作的實際上是輸入參數的一個副本(即函數創建了一個臨時變量,其值與輸入參數完全相同),對該副本的操作不會影響輸入參數的值。
     而“按引用傳遞”,可以理解爲副本是一個引用變量,該副本與輸入參數共享存儲區。因此函數內對副本的修改相當於對輸入參數進行修改。

當輸入參數是抽象數據類型時,採用“按引用傳遞”可以避免創建副本時構造函數的調用(以及函數返回時析構函數的調用)。因此按引用傳遞會比按值傳遞更有效率。


“按引用進行函數值返回”有點tricky:
“按指返回”實際上也是在函數中創建一個臨時變量,用於返回。
1)如果返回值類型是內部類型,那麼編譯器通常會在函數返回時將返回值放在register中,然後再從register中將其取出賦給相應的變量。
2)如果返回值類型是抽象類型,register可能沒有足夠大的空間來存儲返回值的數據。那麼這時候編譯器在將輸入參數壓棧之後,調用函數之前,將返回值的地址壓棧。這樣在函數返回的時候直接將數據寫到返回值在棧中的位置處。

而“按引用返回”,對於返回值有一定的限制:即返回值不能是局部變量,必須能生存在函數作用域之外。
比如下面三種情況,第一種是錯誤的,後面兩種是正確的:

int& f(int& a){
    int b = a;
    b++;
    return b;
}

int& f(int& a){
    a++;
    return a;
}

int& f(int& a){
    static int b = 0;
    return b;
}


也就是說,按引用傳遞的返回值的存儲區都是在函數之外,因此操作就簡單的多了,編譯器在函數調用期間一直對返回值的地址操作,在函數結束返回時,返回的實際上是返回值在函數外部的存儲區中的值。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章