C++
class Target{ private: int a; }
class Object { private : Target target; }
Object* obj = new Object;
请问:target 是在堆上?还是栈上??
![]() | 1 poorcai 2018-09-25 17:46:09 +08:00 via iPhone 堆上 |
![]() | 3 innoink 2018-09-25 17:47:44 +08:00 private : Target target; 这只是一个结构描述,并不是实际会执行的语句。 所以,肯定是都在堆上啊 |
4 tinykey 2018-09-25 17:48:30 +08:00 堆上啊大兄 dei |
5 000wangxinyu000 2018-09-25 17:50:03 +08:00 @poorcai 为啥在栈上啊 |
![]() | 7 innoink 同样是 int a; 在一个函数里这句话会被执行,作用是开一个局部变量 在一个结构描述里,这句话不会被执行,只是起到描述作用,有这么一个类型的成员,具体成员放在哪不管 |
8 814084764 OP |
9 814084764 OP |
11 iceheart 2018-09-25 17:54:18 +08:00 via Android 只能说是 new 出来的,想把它摆在栈上也不难 |
13 814084764 OP @innoink 可能我的例子写的不全。 比如 Target 有一个函数:int getA(){return a }; Object 中调用 target.getA()。这个时候已经产生成员了吧? 这个时候 target 是在堆还是栈呢? |
14 bytelee 2018-09-25 18:01:00 +08:00 target 在哪 取决于你是怎么生成的他吧 |
![]() | 15 innoink 2018-09-25 18:01:42 +08:00 @814084764 Object 中调用 target.getA() 你要在哪里调用这个? Obejct 的构造函数吗?还是一样的。在 obj 创建之时,在 Object()调用之时,target 就已经有内存了,只不过没有初始化。Object()的作用只是初始化 target,并不能决定 target 在哪里分配。 |
16 MeteorCat 2018-09-25 18:13:50 +08:00 via Android 按你生成的方式决定 |
![]() | 17 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()。 |
![]() | 18 linghutf 2018-09-25 19:43:21 +08:00 堆上,Target target 只是声明了一个对象,还没有实例化,在 new Object 后调用其默认构造函数,于是 target 初始化到堆上。 |
![]() | 19 broker 2018-09-25 20:00:55 +08:00 可以把 target 改成一个大数组,直到报错,看看报什么错。。。 |
20 tangweihua163 2018-09-25 21:06:27 +08:00 一个实例部分在栈上部分在堆上还真是常有的事。 |
![]() | 21 bumz 2018-09-25 21:12:47 +08:00 Object 在堆的时候在堆,Object 在栈的时候在栈 习惯了 java 是不是很难受 hhh |
22 zwh2698 2018-09-25 21:25:40 +08:00 via Android Target 改什么都在堆上,内存的分配主要是开对象分配的方式,如果 new 和 placement new 一般在堆,但是后者可以放在栈上,那也是提前你保留了。栈都是编译时候就决定了,大小在这个时候一定可以推导出来,堆是在运行时候分配,大小要看上下文 |
23 senxxx 2018-09-25 22:44:15 +08:00 via Android @poorcai 大兄弟。在栈上的话。。如果 obj 指针被作为返回值返回给上一层。。那此时的 target 是个什么情况? |
![]() | 24 yujincheng08 2018-09-25 22:52:14 +08:00 via Android 堆 |
25 linshuang 2018-09-26 09:22:30 +08:00 肯对是堆,要是栈,你觉得它能用么。。。 |
![]() | 26 seancheer 2018-09-26 09:50:01 +08:00 堆啊。。 target 占用的内存是属于 new 出来的 obj 的,obj 是你 new 出来的,那么就在堆上。 如果直接 Object obj,那么就是在栈上面。 class Object 的时候,这个属于声明,不会占用内存的。 |
![]() | 27 justou 2018-09-26 10:23:53 +08:00 堆上. 不能在栈上的原因上面提到了. C++也可以 new 在栈上, 叫 placement new, 在某些场景下非常有用 https://www.geeksforgeeks.org/placement-new-operator-cpp/ |
![]() | 28 wizardoz 2018-09-26 12:47:59 +08:00 凡是 new 的都在堆上 |
![]() | 29 cuzfinal 2018-09-26 14:22:16 +08:00 当然是在堆上了,难道 object 里 int a = 1 会在栈上吗? |
30 dychenyi 2018-09-26 16:22:44 +08:00 堆上啊。 反证法:Target target 如果在栈生成,每个类都是由子类和数据类型构成的,那么没有一个类能在堆上了。 |