在C++中,当我通过值将对象传递给函数时,是否会将对象复制到堆栈中?

Rya*_*cus 4 c++

我刚刚开始进入C++(我是一个经验丰富的Python/Java开发人员进入OpenCL的更好部分),我对如何将对象传递给函数感到困惑.

假设我有一个简单的类:

class Thing {
    int var;
    int var2;
    int var3;

    void doSomething();
};
Run Code Online (Sandbox Code Playgroud)

现在,这个类的"大小"至少是3*sizeof(int)(我不确定是否存储了函数指针).现在说我有两个功能签名:

void doThing1(Thing t);
void doThing2(Thing* t);
Run Code Online (Sandbox Code Playgroud)

当我调用时doThing1,是否会将整个实例复制到堆栈中?当我打电话时doThing2,它只需要sizeof(Thing*)堆栈空间吗?

互联网上的许多"传统智慧"一直在告诉我尝试使用功能签名doThing1,但乍一看似乎非常愚蠢 - 如果它确实复制了整个对象.

我还假设如果一个函数要修改堆上的对象(使用new关键字创建),它应该看起来像doThing1.

请纠正我的无知.要么我的Google搜索没有帮助,要么Google没有帮助.

Mud*_*Mud 5

当我调用doThing1时,是否会将整个实例复制到堆栈中?当Ic都是doThing2时,它是否只需要sizeof(Thing*)堆栈空间?

是的,是的.

互联网上有很多"传统智慧"告诉我尝试使用doThing1的功能签名

哪里?

如果需要在被调用者中进行修改 Thing,则必须传递指针或引用.如果你不需要修改Thing,你应该只传递一个const引用(为你提供保护,防止错误状态修改pass by value,以及通过引用传递的效率).

void doThing(const Thing& t)
Run Code Online (Sandbox Code Playgroud)