4

我刚刚开始接触 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.

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

4

4 回答 4

5

当我调用 doThing1 时,是否会导致整个实例被复制到堆栈中?当Ic全部做Thing2时,是否只需要sizeof(Thing*)堆栈空间?

是的,是的。

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

在哪里?

如果您需要在被调用者中进行修改 Thing,那么您将必须传递一个指针或引用。如果您不需要修改Thing,您应该只传递一个 const 引用(保护您免受值传递的错误状态修改,并具有传递引用的效率)。

void doThing(const Thing& t)
于 2012-07-11T19:13:40.080 回答
3

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

是的,是的。

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

不存储函数指针;大小为 3 × sizeof(int)。(演示)

于 2012-07-11T19:11:47.700 回答
2

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

void doThing2(const Thing& t);

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

于 2012-07-11T19:13:08.057 回答
1

通过 const 引用传递它们void doThing1( const Thing &t)

于 2012-07-11T19:13:41.973 回答