求助,想获得一些关于 C++学习的建议

2023-03-29 09:58:01 +08:00
 Symbo1ic

本人为大三本科生,因为对游戏引擎感兴趣自己正在学习并且尝试实践 c++。这是我的项目链接LRE2。最近看了很多文章,觉得自己对 cpp 理解很有问题,比如说关于share_ptr的滥用问题,在个人的项目中处理的非常差。还有就是关于语言的高级特性也是完全不明白,因此希望得到一些关于 cpp 学习的路径。很多推荐的材料感觉都偏基础,而且大部分都是视频材料,个人吸收效果不是很好。如果可以的话希望得到一些文字材料推荐。

5100 次点击
所在节点    C++
27 条回复
hanguofu
2023-03-30 06:24:00 +08:00
@zeal7s : 请问在什么场景下应该使用 unique_ptr/raw_pointer 啊 ?
Symbo1ic
2023-03-30 08:41:37 +08:00
@xmmmmovo 目前的话有过 unity 游戏开发经验,之前有用 ue 的蓝图试着搭一些小东西。有的时候真的觉得他们在脚本层接口设计十分巧妙
exch4nge
2023-03-30 10:26:36 +08:00
@Symbo1ic
raw 用在能确定指针有效的情况,指针指向对象的生命周期肯定比当前类对象要长,能不用就不用。

其余不用共享的用 unique ,明确表示有所有权。需要所有权转移也用,函数参数返回值等。
(不用转移所有权,但用来延后初始化的场景建议用 optional )

share_ptr 共享用,随处都用的话得避免循环应用,可以用 weak 解决。有时也用 atomic store load 来做原子操作多线程安全切换里面的对象

内存使用大小上,share 最大,有 custom delete 的 unique 稍微大,没有的 unique 跟 raw 一样
性能上 share 最差,unique 与 raw 接近
zeal7s
2023-03-30 11:14:13 +08:00
@Symbo1ic 还是拿父窗口和子窗口来举例子,父窗口生成子窗口并且用 unique_ptr hold 住子窗口,子窗口生成时拿到指向父窗口的 raw pointer 。只要能保证父窗口的生命周期长于子窗口,即父窗口先于子窗口创建,晚于子窗口销毁,就能保证 raw pointer 不失效。

所有权这块的使用原则就是一个对象逻辑上属于谁,所有权就是谁。现代 C++里面有所有权这个概念而其他语言里这个概念比较模糊的原因是,现代 C++通过 RAII 来控制堆上对象的生命周期。一个类拥有一个对象的所有权就表示这个类在调用自己的析构函数时也负责自动调用这个对象的析构函数。所以写程序时,想清楚堆上的对象由谁来负责销毁在逻辑上最合适,那么所有权也就想清楚了。

换一种情况,如果程序中允许父窗口先于子窗口关闭,那么继续让父窗口通过 unique_ptr 持有子窗口就不合适了,因为父窗口销毁时也会自动调用子窗口的析构函数。此时需要一个窗口管理器来拥有所有的窗口,比如在窗口管理器中可以写:std::vector<std::unique_ptr<Window>> allWindows 。这样只要保证窗口管理器类晚于所有窗口销毁就行了。

可以看看 muduo 这个 C++网络库,作者也有出书介绍,网上也有大量的文章和视频介绍。里面有挺多 unique_ptr 和 shared_ptr 用法。
zeal7s
2023-03-30 11:31:38 +08:00
@Symbo1ic 比如你的代码里 https://github.com/hundan2015/LunaticRenderer2/blob/master/lunatic_engine/core/LunaticEngine.h#L14

rendering_core_、entity_manager_和 resource_core_在逻辑上由引擎类负责管理销毁最合适,那么它们使用 unique_ptr 就行了。这里不存在共享所有权的情况,用 shared_ptr 就没必要了。
DwiwO7a6Uyv33RHs
349 天前
DwiwO7a6Uyv33RHs
349 天前
可以看下这个网站: https://csguide.cn/cpp

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

https://yangjunhui.monster/t/928055

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

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

© 2021 V2EX