我刚刚开始进入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
。
请纠正我的无知。我的谷歌搜索没有帮助,或谷歌没有帮助。
答案 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)