瓜又通胀啦(
c++吧
全部回复
仅看楼主
level 15
幻の上帝 楼主
有的人就是太

了。
插楼删。
2019年03月06日 13点03分 1
level 15
幻の上帝 楼主
说实话我是不大理解一些人的心态,半桶水咣当响还以交流为幌子氵贴。氵贴就算了,还尽犯低级错误有意无意误导读者,给别人凭空增加工作量。要么你是营销号也罢了,否则这种损人不利己寻开心意义何在?贴吧jy真的那么值得浪费时间?[阴险]
2019年03月06日 13点03分 2
2019年03月26日 01点03分
level 15
幻の上帝 楼主
(这氵贴氵出基础错误还当作答疑的,按理是可以直接炸的。怕这位还不大服的样子,就先给你留着,结果一看果然炸了。)
这位 phoenix2017 还有一些言论还得广而告之一下。
> 冷嘲热讽的没啥意思吧
这甚至连被嘲讽的等级都没到。就事论事评价 LZ 的氵和某些群众会轻信这样的交流不浪费时间似的而已。
> 贴吧待久了吧,天有一个井大?
不好意思,至少就本吧讨论的主题而已,上面这位能看到的天确实还没这里的井大。
不过这话也不仅适用上面的这位,据我所知确实有不少错误形势的。不信的,自己列举出 ISO/IEC JTC1 里有几个水货水平比自己低的,找出确凿理由说出来听听,看看谁在充内行指 点 江 山。[阴险]
2019年03月06日 13点03分 4
level 15
幻の上帝 楼主
好在发现得早,该贴似乎只有一位提问的苦主 @Cenlly👀 (id 文乃是天)。
提问:
> 内存管理这一块 由于我之前从事java 所以c++ 对象我一律放堆空间 这样有什么问题吗
phoenix2017: 放堆没问题,那个就是动态分配,不过也有临时变量什么的这些方法,要根据具体情况来定
文乃是天: 回复 phoenix2017 :对象放栈空间 传给另一个方法的时候是值传递还是引用传递?
phoenix2017: 这是行参实参的概念
文乃是天: 回复 phoenix2017 :你答非所问啊 我还是自己去试试吧
emmm,虽然提问者确实挺水的,不过xwlj该 LZ 的回复被退货了……[滑稽]
至于要不答非所问?C++里什么堆什么栈八成就是答非所问,尤其是没基础还想速成的。谁教的什么“堆”“栈”就扁谁去,先搞清楚要提的问题再说。
另外,当时我评论说“12级了还进这种贴问问题也是醉了”,是奇怪就算签到上 12 级也是要花功夫的,何况原来搞 Java ,隔壁应该见惯了氵的架势,在这种内容粗糙的贴子面前不该上当才是。不过实际上这位提问者看来确实没混隔壁,这点我搞错了道歉。
2019年03月06日 13点03分 5
level 15
幻の上帝 楼主
EOF
PS. 以上 at 的某 LZ 主要是方便点进去自助小黑屋加餐用。
2019年03月06日 13点03分 6
level 13
Java半年前取关了
2019年03月06日 14点03分 7
level 13
培训的 基础太差没办法
2019年03月06日 14点03分 8
我好奇一下“全部放堆空间”是指new出来吗?
2019年03月06日 14点03分
2019年03月06日 15点03分
@Cenlly👀 主要问题是容易写错(比如忘了释放)。将来要常用C++的话可以先适应不用new。
2019年03月06日 15点03分
@M_P_C_King 释放问题倒是不用担心 主要是这样做比较接近java的做法 而且在方法调用的时候放堆里反而没有放在栈里那么乱
2019年03月06日 15点03分
level 1
啥?
2019年03月06日 15点03分 9
level 15
幻の上帝 楼主
@Cenlly👀 你如果愿意听详细解释,那我就先列个大纲。
首先,你先得清楚一个结论:不管C++还是Java,纠结对象具体放哪里绝大情况下都是没有意义的,并且不是语言的内容(要纠结的时候肯定语言和实现相关)。要关心的重点是怎么创建使用对象会影响哪些行为,而不是对象放哪。
第二,C++和Java的new语法都是从传统面向对象语言(Smalltalk)里抄过来的,本身其实不计较放哪。但是C++还有不用new创建对象的语法,机制上确实不一样。具体哪里不一样之后说。
第三,搞清对象模型的重点。C++跟C一样,对象是指特定类型的存储,而不是Java和class-based OO所谓的类的实例,虽然C++中类类型的前者刚好能实现后者。就存储意义上,对象实现上的生存期必须是有始有终的(至少内存不能稀里糊涂放弃了),但是Java这样要求用GC的语言本质上只允许确定性的(deterministic)创建,而对象什么时候销毁是GC而不是写代码的说了算。
C++相反,创建和销毁都是确定性的。这样做有个直接的好处:销毁时可以附带管理要求确定释放的保守资源(比如锁、数据库连接),而不仅仅是非确定性的内存。
Java是不提供这种精确的控制的,finalizer调用时机本质上是不确定的(而且主流GC为了追求吞吐量,原理上就不可能允许完全确定的资源释放),这不适合内存以外的几乎所有资源,于是你基本上显式清理。
注意没有GC不代表你必须手动显式地管理资源,C++用RAII直接可以适用所有这些不管资源是不是内存的情况。虽然Java后来有try with resource这种机制,也只能用在在局部;而C++ RAII对象指称或者包装的资源是可以直接返回值跨函数传递的。这不仅仅使代码干净容易维护(少了new废话也少),而且一定程度上更高效。退一步讲,即使要用new,正常的代码也不应该直接用,因为没对应释放就直接漏了没有GC垫着,这种情况也应该用智能指针。所以C++是提倡能不用new就尽量不用。
第四,关于传参……这是个大坑。Java那种传参本质上还是传值,虽然名义上传的这个值可以是原始类型的值或者引用值。后者按C++的做法比较接近传共享引用的智能指针,而不是C++意义上的引用——C++你可以直接传非const引用实现swap,Java就不行。其实不管语言设计还是实现中这种默认隐含别名(对象的存储允许被多个变量引用)都是比较复杂的东西,只不过Java掩盖了大部分问题让它表面上简单罢了。
2019年03月06日 23点03分 10
1