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

时间:2012-07-11 19:10:24

标签: c++

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

假设我有一个简单的课程:

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

    void doSomething();
};

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

void doThing1(Thing t);
void doThing2(Thing* t);

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

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

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

请纠正我的无知。我的谷歌搜索没有帮助,或谷歌没有帮助。

4 个答案:

答案 0 :(得分:5)

  

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

是的,是的。

  

很多传统智慧"在互联网上一直告诉我尝试使用doThing1的函数签名

在哪儿?

如果您需要在被叫方中修改 Thing,那么您将拥有来传递指针或引用。如果您不需要修改Thing,您应该只传递一个const引用(为您提供保护,使其免受错误状态修改传递值的影响,以及通过引用传递的效率)。

void doThing(const Thing& t)

答案 1 :(得分:3)

  

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

是的,是的。

  

现在,这个类的“大小”至少是3 * sizeof(int)(我不确定是否存储了函数指针)。

没有存储函数指针;大小是3×sizeof(int)。 (Demo)

答案 2 :(得分:2)

在这两种情况下你都是对的。您还可以使用引用,这可以避免复制,但也避免使用指针:

void doThing2(const Thing& t);

这是我的偏好,因为它很容易被编译器优化,并有助于避免错误(如在函数中重新分配)。

答案 3 :(得分:1)

通过const引用void doThing1( const Thing &t)

传递它们