[英]How does C++ know how many bytes to copy when retuning an object from a function?
當我看到以下警告時,這個問題突然出現在我的腦海中。
struct Wrapper{
char somechar[10];
};
auto returnFoo() {
char somechar[10];
return somechar; // Warning: address of stack memory returned!
}
auto returnFoo() {
Wrapper wpr;
return wpr; // OK
}
我理解警告。 但是我不明白為什么當我使用包裝器時它會消失。
我猜編譯器可以計算出類有多大並復制正確數量的字節,但不能對指針 (char[]) 做同樣的事情??
類的“大小”存儲在哪里(我想不在堆棧中,因為那會很浪費,也許在數據段中?)
編輯:我想我的問題表述有誤,我知道sizeof
並且對 CPP 有一些經驗。 我得到 char[] 衰減為 char*。 而且我知道第一個示例返回一個指針,第二個示例返回一個對象。
我要問的更多的是編譯器的內部是如何工作的。 對於編譯器,內存布局完全相同(給予或接受),它需要做的是復制數組並將其返回。 它需要知道要復制多少字節。 我的問題是,為什么它可以在使用對象時弄清楚,但不能用 char[]
函數不能在 C++ 中返回數組。 這只是語言的指定方式。 這在 C 中是一樣的。
在第一個示例中,數組名稱衰減為指向數組第一個元素的指針,推導出的返回類型是指向 char 的指針。 指針是可以返回的,但是指針會失效,因為函數返回時指向的對象的自動存儲已經被釋放了。
當我使用包裝紙時,我不明白為什么它會消失。
使用包裝器時,不會返回指針。 您返回本地類實例的副本。 數組存儲在類中。
我猜編譯器可以算出這個類有多大
編譯器知道類是如何定義的,因此它知道大小。 您可以通過使用sizeof(Wrapper)
來了解編譯器對自己的了解。
類的“大小”存儲在哪里
取決於語言實現。 在典型的情況下,編譯器會為CPU生成諸如“將堆棧指針遞增10”之類的指令,因為編譯器知道大小為10。它知道大小,因為它知道定義。
這個定義存儲在哪里(符號表、數據段、堆棧、文本段)?
這些都沒有。 您已將定義存儲在源文件中。 編譯器將解析該信息並將信息以某種內部表示形式存儲在編譯器進程的內存中。
是編譯器為 CPU 生成指令,因此只有編譯器需要知道大小。 生成的程序不生成指令(C++語言不能自行修改),所以不需要知道類型定義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.