[英]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.