在堆?还是栈?

2018-09-25 17:41:45 +08:00
 814084764

C++

class Target{ private: int a; }

class Object { private : Target target; }

Object* obj = new Object;

请问:target 是在堆上?还是栈上??

4389 次点击
所在节点    程序员
30 条回复
poorcai
2018-09-25 17:46:09 +08:00
堆上
poorcai
2018-09-25 17:46:28 +08:00
@poorcai #1 说错,在栈上
innoink
2018-09-25 17:47:44 +08:00
private : Target target;
这只是一个结构描述,并不是实际会执行的语句。
所以,肯定是都在堆上啊
tinykey
2018-09-25 17:48:30 +08:00
堆上啊大兄 dei
000wangxinyu000
2018-09-25 17:50:03 +08:00
@poorcai 为啥在栈上啊
current
2018-09-25 17:50:21 +08:00
@poorcai 为啥是栈? CPP 同一个 instance 还能拆成几块,一部分在堆上一部分在栈上不成
innoink
2018-09-25 17:51:09 +08:00
同样是 int a; 在一个函数里这句话会被执行,作用是开一个局部变量
在一个结构描述里,这句话不会被执行,只是起到描述作用,有这么一个类型的成员,具体成员放在哪不管
814084764
2018-09-25 17:51:56 +08:00
@innoink 不是在创建的时候自动调用成员变量的构造方法么?

@tinykey 这个 target 不是程序员需要手动释放的,不是在栈上么?
814084764
2018-09-25 17:53:23 +08:00
@innoink 也就是说,在创建 Object 的时候,不会自动调用成员变量 target 的构造方法了?

@current 不可以吗?不知道。。哈哈
innoink
2018-09-25 17:53:26 +08:00
@innoink 构造方法里面也不是 int a;啊
都是类似这种:
this->a = parameter_a;这样的
iceheart
2018-09-25 17:54:18 +08:00
只能说是 new 出来的,想把它摆在栈上也不难
innoink
2018-09-25 17:54:44 +08:00
@814084764 构造方法中,没有办法知道自己是在栈上还是在堆上。构造方法只是用来初始化成员的,并不能用来产生成员。
814084764
2018-09-25 17:57:56 +08:00
@innoink 可能我的例子写的不全。
比如 Target 有一个函数:int getA(){return a };

Object 中调用 target.getA()。这个时候已经产生成员了吧?
这个时候 target 是在堆还是栈呢?
bytelee
2018-09-25 18:01:00 +08:00
target 在哪 取决于你是怎么生成的他吧
innoink
2018-09-25 18:01:42 +08:00
@814084764 Object 中调用 target.getA()
你要在哪里调用这个? Obejct 的构造函数吗?还是一样的。在 obj 创建之时,在 Object()调用之时,target 就已经有内存了,只不过没有初始化。Object()的作用只是初始化 target,并不能决定 target 在哪里分配。
MeteorCat
2018-09-25 18:13:50 +08:00
按你生成的方式决定
innoink
2018-09-25 18:20:57 +08:00
@814084764 你的意思可能是:
class Object
{
public:
int foo()
{
return target.getA();
}
private:
Target target;
}

首先,这里还是不知道 target 是在堆上还是栈上,但是没关系,就算 target 没分配内存,getA()的函数代码都在那里,都能调用。你要是问"target 都没有怎么返回 a"?成员函数隐含传入 this 指针,只要运行时 this 指针能确定就行了;在 foo 里面,也会有 Object 的 this 指针,通过偏移量能计算出 target 的 this 指针传给 getA()。
linghutf
2018-09-25 19:43:21 +08:00
堆上,Target target 只是声明了一个对象,还没有实例化,在 new Object 后调用其默认构造函数,于是 target 初始化到堆上。
broker
2018-09-25 20:00:55 +08:00
可以把 target 改成一个大数组,直到报错,看看报什么错。。。
tangweihua163
2018-09-25 21:06:27 +08:00
一个实例部分在栈上部分在堆上还真是常有的事。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/492451

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX