今天我教了几个朋友如何使用C struct
s.其中一个问你是否可以struct
从一个函数返回一个函数,我回答说:"不!你会返回指向动态malloc
编辑struct
的指针."
来自主要使用C++的人,我期望无法struct
按值返回s.在C++中,您可以operator =
为对象重载并完全理解为具有按值返回对象的函数.但是,在C中,你没有那个选项,所以它让我思考编译器实际上在做什么.考虑以下:
struct MyObj{
double x, y;
};
struct MyObj foo(){
struct MyObj a;
a.x = 10;
a.y = 10;
return a;
}
int main () {
struct MyObj a;
a = foo(); // This DOES work
struct b = a; // This does not work
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我理解为什么struct b = a;
不能工作 - 你不能operator =
为你的数据类型重载.它是如何a = foo();
编译罚款?这是否意味着什么struct b = …
(这个问题特定于我的机器的架构和调用约定,Windows x86_64)
我不记得我在哪里读过这个,或者我是否正确地回忆过它,但我听说过,当一个函数应该按值返回一些结构或对象时,它会填充它rax
(如果对象可以适合在寄存器宽度为64位)或传递一个指针,指向结果对象将在哪里(我猜测在调用函数的堆栈帧中分配)rcx
,在那里它将执行所有通常的初始化,然后a mov rax, rcx
为返回行程.就是这样的
extern some_struct create_it(); // implemented in assembly
Run Code Online (Sandbox Code Playgroud)
真的会有一个秘密的参数
extern some_struct create_it(some_struct* secret_param_pointing_to_where_i_will_be);
Run Code Online (Sandbox Code Playgroud)
我的记忆是正确的,还是我错了?如何通过函数的值返回大对象(即宽度超过寄存器宽度)?