熟練了 C,被 C++把世界觀搞崩壞了

2020-09-30 00:19:09 +08:00
 bitdepth

我不敢說我很理解 C 當中的語法,水準也就給 linux kernel 寫寫 patch,會修補一下 gtk+程式。

因為最近工作的關係,要開始用 C++ 剛開始的時候特別不理解 template 的用法,後來發現只是一個限制很多的 macro,當然很複雜的用處還是不懂。

smart pointer 的 concepts 花了很多時間才明白。

  1. 第一是 c++對 type 的要求非常嚴格,類似在 C 中 void *這樣的儲存是絕對不允許的。
  2. 也是搞不懂上面講的 template,一直不懂怎麼在 wrapper class 當中放下那麼多型別的資料,後來才發現需要依賴類似 std::variant 這樣的方法。
  3. ownership 的控制,什麼時候可以用一下 raw pointer 不是什麼地方都要堅持只能用新的 smart pointer
  4. 對 class destructor 的要求,我之前不知道 C++ compiler 會幫忙填充 vtable 和進行 offset 換算的工作,這在 glib 中原本都是要手寫。

上面這些明白以後,發現還是可能要在在 wrapper class 的 declare 前把那些存進來的 class 的 declare 全部導入進來,不隱私而去拖慢編譯速度。繼續問人之後發現,只需要在 wrapper class 做 customize operator= 和 desructor 即可。又發現一件事不明白

  1. 對 compiler 的行為不理解,特別是 object 的處理行為

等別人手把手寫給我用例後,我不是很理解反正就先開始用了。 我今天在問如何生成 instance 並加入 smart pointer 列管的時候,得知了 RVO 這樣的東西,而不是保留在 C 當中的習慣使用 pointer

在 c++很多時候應該使用 by value or by refer 。這讓我完全混亂了,不知道究竟 pointer 還有什麼意義。本來 C 當中有 pointer 完全是因為 performance issue 。而 c++ compiler 竟然會知道幫你改成 pointer copy 。

9075 次点击
所在节点    C++
48 条回复
Wirbelwind
2020-10-02 01:42:24 +08:00
3.ownership 的控制,什麼時候可以用一下 raw pointer 不是什麼地方都要堅持只能用新的 smart pointer

ownership->所有权->让 new 的生命周期和当前 smart pointer 变量生命周期同步

smart pointer 本身是局部变量或成员变量,通过这样的方式不需要手动 new 和 delete

①程序类型结构上出现有循环引用,结构下级保留指向上级的 weak_ptr 或 raw ptr

②用到了 c 语言的库,用 smart pointer 管理

③需要用指针进行运算的时候,只能用 raw pointer

4.對 class destructor 的要求,我之前不知道 C++ compiler 會幫忙填充 vtable 和進行 offset 換算的工作,這在 glib 中原本都是要手寫。

极其不建议写带 virtual 的代码

---------------------------------------

對 compiler 的行為不理解,特別是 object 的處理行為

写多了就熟悉了,c 是 c,c++是 c++
impig33
2020-10-02 11:04:42 +08:00
@killerirving

c--不是更好
tairan2006
2020-10-02 11:32:07 +08:00
兄弟,用 go
secondwtq
2020-10-02 11:56:22 +08:00
“编译器行为学是 C++ 的特色,不能不品尝”
user8341
2020-10-08 21:34:54 +08:00
@cmdOptionKana 没错。C++太灵活了不统一风格不行。很多项目都用《 Google C++ Style Guide 》,不知道大家如何评价?

像楼主提的最后一个问题:by value or by refer 什么情况用哪个,在 Google 风格指南里就有要求:

input parameter 用 by value 或者用 const &。
output parameter 用指针。

个人认为好处是,从调用函数的地方很容易看出一个变量会不会被函数改变。比如 f(x, &y),很明显 x 不会变,y 会变(因为它取地址,是作为指针传入,必然是 output parameter )。
user8341
2020-10-09 10:58:42 +08:00
@user8341 发现还是自己看错了。谷歌指南还分把参数分成可选或必须两种。可选的才用指针,因为引用不能传空值。必须的参数就一律用传值或引用。

是不是说小对象就传值,大对象就传引用呢?
Wirbelwind
2020-10-10 11:55:50 +08:00
@user8341 看个人用法。

c 用 pointer ( c 没有引用)。c++建议传 reference,要避免出现 raw pointer,写 argument 的时候也不会出现&,如果不修改变量,加 const,否则不加。
levelworm
2020-10-27 01:15:20 +08:00
@cmdOptionKana 我觉得大公司写 C++的话肯定要有 guide,什么能用什么不能用,否则一些炫技的东西真心吃不消。

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

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

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

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

© 2021 V2EX