函式呼叫和賦值運算

2021-07-07 05:13:38 字數 999 閱讀 9999

華電北風吹

天津大學認知計算與應用重點實驗室

日期:2015/11/15

一、c++中記憶體分配

c++編譯器將計算機記憶體分為**區和資料區。資料區又分為靜態資料區、動態資料區。動態資料區又包含堆和棧。

**區:唯讀,任何修改行為非法。存放編譯後的**,包括類的成員函式等。

資料區:存放程式編譯和執行過程出現的變數和常量。

靜態資料區:全域性變數以及靜態變數存放在靜態資料區。

動態資料區:包含堆和棧。

常量:通常情況下被放在**區,有的系統將常量存放於靜態資料區(字串常量)。常量的所在的記憶體空間受系統保護,修改將造成記憶體訪問出錯,常量的生命週期一直到程式結束為止。

參考部落格:(

二、堆和棧

棧:主要存放函式的引數以及區域性變數。整個程式的棧區的大小可以在編譯器中由使用者自行設定。

堆(heap):是為動態分配預留的記憶體空間。

每乙個執行緒都有乙個棧,但是每乙個應用程式通常都只有乙個堆(儘管為不同型別分配記憶體使用多個堆的情況也是有的)。

參考部落格:(

三、賦值運算與臨時變數

在呼叫函式的時候,實參和形參是通過賦值運算建立聯絡的。但是當實參和引用引數型別不匹配時,c++將生成臨時變數。具體情況是若函式呼叫的引數不是左值或與相應的const引用引數的型別不匹配,則c++將建立型別正確的匿名變數,將函式呼叫的引數的值傳遞給匿名變數,並讓引數引用該變數。

參考:c++ primer 第八章 8.2.3引用的屬性的特別之處 p262

四、函式的呼叫過程

在讀取函式引數的時候,對於c/c++,入棧順序是從左向右依次入棧。因為兩個形參計算順序之間沒有順序點(sequence point),所以這裡計算順序就看編譯器了,不過經測試vs2013是由左向右。

參考部落格:

( very well ( (

五、函式引數的返回問題

函式的返回值存在哪兒了呢?

(六、其他的參考高階部落格

(

建構函式和賦值運算子過載函式哪個被呼叫先?

兩個函式的形參都可以對應的上的話,傾向於使用賦值運算子過載函式。class bird void operator string temp void print bird int main 建構函式被呼叫 xiejunyan 運算子過載函式被呼叫。yanjunxie 析構函式被呼叫class bird...

拷貝建構函式和賦值構造函式呼叫次序

class cprintelement cprintelement cprintelement const cprintelement temp cprintelement cprintelement operator const cprintelement temp int main cprint...

賦值運算子函式

賦值運算子函式的 需要關注幾點 1 是否把返回值的型別宣告為該型別的引用,並在函式結束前返回例項自身的引用 即 this 只有返回乙個引用,才可以允許連續賦值。否則如果函式的返回值void,該賦值運算子將不能做連續賦值。2 是否把傳入的引數的型別宣告為常量引用。引數宣告為引用可以避免無謂的消耗,提高...