相关疑难解决方法(0)

从C中的函数返回`struct`

今天我教了几个朋友如何使用C structs.其中一个问你是否可以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 = …

c

153
推荐指数
6
解决办法
25万
查看次数

C/C++在引擎盖下按值返回struct

(这个问题特定于我的机器的架构和调用约定,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)


我的记忆是正确的,还是我错了?如何通过函数的值返回大对象(即宽度超过寄存器宽度)?

c c++ assembly win64 x86-64

3
推荐指数
2
解决办法
881
查看次数

标签 统计

c ×2

assembly ×1

c++ ×1

win64 ×1

x86-64 ×1