比方說,我有一個這樣的結構:通過值傳遞的C++向量:我得到它的權利?
struct typeA
{
long first;
string second
double third;
};
如果我宣佈
typeA myArray[100];
然後myarray的存儲在堆棧中,消耗的sizeof(的typeA)* 100個字節的垃圾數據(直到我存儲一些實際的數據,至少)。
每當我將這個數組作爲參數傳遞時,我總是將指針傳遞給堆棧中第一個元素的第一個元素。所以指針從棧到堆棧。
但是,如果我聲明
vector<int> myVector (4, 100);
然後myVector對象實際上存儲在堆棧中,它包含一個指向的4 *的sizeof(int)的數組的第一元素的字節存儲在堆,在那裏存儲實際的數據。所以指針從棧到堆。
每當我通過這個載體作爲參數,如果我把它添加到參數列表如下:
vector<int> parameterVector
功能得到myVector對象,並將其存儲在堆棧中的副本。
但是,如果我不喜歡這樣寫道:
vector<int> ¶meterVector
的功能得到了參考myVector存儲在堆棧中,所以我現在都存儲在堆棧中的變量,引用也存儲在myVector對象在堆棧中,它包含一個指向存儲在堆中的實際元素數組的指針。
這是正確的嗎?
我有幾個疑惑這裏:
- 做實際的元素,會存儲在一個靜態數組(由C繼承而來的,用方括號表示)在堆中?
- myVector對象是否只有一個指向第一個元素的指針,或者它有多個指向每個元素的指針?
- 因此,按值傳遞一個向量不會帶來很大的問題,因爲唯一被複制的是矢量對象,但不是實際的元素。是這樣嗎?
- 如果我弄錯了所有的東西,並且實際的元素也被複制以及通過值傳遞向量參數,那麼爲什麼C++允許這樣做,考慮到它會阻止它與靜態數組? (據我所知,靜態數組總是作爲參考傳遞給第一個元素)。
謝謝!
如果按值傳遞一個向量,則元素也會被複制 –
聲明'vector&parameterVector'聲明'parameterVector'是'typeA'元素的向量的引用*,而不是指針。 –
而關於'vector myVector(4,100)',那不是一個有效的聲明。它試圖創建一個由四個元素組成的向量,每個元素初始化爲「100」。但是你不能將'typeA'對象初始化爲'100'。 –