[英]How are C structs with arrays returned?
假設我們有:
typedef struct {
uint8_t someVal;
} Entry
typedef struct {
Entry grid[3][3];
} Matrix
//Make a 3x3 matrix of all 0s
Matrix emptyMatrix(void) {
Entry zero = {.value = 0}
Matrix matrix;
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++) {
//Shallow copy empty struct
matrix.grid[i][j] = zero;
}
return matrix;
}
Matrix myMatrix = emptyMatrix();
我理解在C中我們可以從函數返回一個結構 ,所以這個工作,我測試了它。 但是,我不清楚作業如何工作。
編譯器是否為myMatrix
分配內存,然后復制emptyMatrix()
返回的Matrix
結構中數組的每個Entry
元素?
我想知道Matrix
的內存映射也會有所幫助 - 我假設因為grid
是一個Matrix
的內存包含指針的數組。 但是,它顯然存儲了價值 。 如果是這種情況,我對作業如何運作的猜測對我來說更有意義。
編輯:似乎人們沒有完全回答這個問題。 我想知道我對分配工作原理的猜測是否正確。
Matrix
每個實例都包含一個3x3的Entry
數組 。 將一個Matrix
實例分配給另一個實例時,源矩陣的內容將被復制到目標矩陣。
數組不是指針。 如果表達式不是sizeof
或一元&
運算符的操作數,或者不是用於初始化聲明中的字符數組的字符串文字,則數組表達式將“衰減”為指針。
例如,如果你有一個函數調用
printMatrix( myMatrix.grid );
表達 myMatrix.grid
具有類型“的3元素數組的3元素數組Entry
”; 因為它不是的操作數sizeof
或一元&
運算符,它“衰變”到類型的“指針的3元素數組表達Entry
”( Entry (*)[3]
和表達式的值是地址grid
的第一個元素(也將是整個Matrix
實例的地址)。
每個環境的ABI定義了如何通過值傳遞和返回結構。 一個常見的選擇是:
寄存器中返回最小為2或4個寄存器的小結構。
對於較大的對象,調用者在其堆棧幀上為返回值分配空間,並將指針傳遞給該函數。 返回時,該函數會將返回的任何對象復制到它收到返回值指針的空間中。 而已。 這種簡單的方法允許遞歸調用。
優化器嘗試最小化復制量,特別是如果它可以內聯函數或者返回值存儲到對象中,而不是丟棄或通過值傳遞給另一個函數。
如果結構具有一個或多個成員數組,則無關緊要。 同樣的方法也適用於工會。
綁定到數組的標識符可能會被解釋為指針,但這並不意味着數組變量是指針。
數組的存儲是結構本身的內存布局的一部分。 與堆棧上聲明的數組相同的方式是堆棧本身。
您可以通過檢查sizeof(Matrix)
。
簡而言之:
編譯器是否為myMatrix分配內存,然后復制emptyMatrix()返回的Matrix結構中數組的每個Entry元素?
是
Matrix
是一種數據類型struct struct {Entry grid[3][3];}
。 對於尺寸為Entry grid[3][3]
Metrix
存儲器類型的每個對象將被分配。
函數emptyMatrix
返回一個Matrix
類型的對象,該對象將像任何其他對象一樣按值返回。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.