假設我們在堆疊上創建一個物件
class Test{
Test(int i) {i_=i;}
Test(std::vector<int> v) {v_=v;}
int i_;
std::vector<int> v_;
};
int main() {
Test a;
// how much memory is occupied/reserved now for a?
.
.
.
return 0;
}
當還不知道要呼叫哪個建構式時,編譯器如何確定“a”所需的大小?我的意思是,堆疊上保留了多少記憶體?如果我使用“新”來創建物件呢?
為了轉移我的觀點,我的示例非常簡化。我的問題的目的是更好地理解堆疊/堆上物件創建/初始化的含義。
uj5u.com熱心網友回復:
當還不知道要呼叫哪個建構式時,編譯器如何確定“a”所需的大小?
這個問題源于兩個誤解:
首先,Test a;確實呼叫了默認建構式。接下來,要在堆疊上分配的物件的大小是一個常數:sizeof(Test). 當更多元素添加到向量成員時,此大小不會改變,因為這些元素不會影響 a 的大小Test,它們是在堆上動態分配的。
如果我使用“新”來創建物件呢?
物體大小沒有區別。sizeof(Test)是一個編譯時間常數,不會根據您創建物件的方式而改變。雖然Test* p = new Test;你只會p在堆疊上,它的大小是sizeof(Test*),而物件在堆上。
PS:實際上“堆”和“堆疊”不是標準使用的術語,但由于它們很常見,我認為在這里使用它們是可以的。更正式地正確的是談論自動和動態存盤持續時間(https://en.cppreference.com/w/cpp/language/storage_duration)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/495538.html
