熟練了 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 。

9041 次点击
所在节点    C++
48 条回复
asuraa
2020-09-30 00:28:16 +08:00
我也是 经常写 windows 内核 基本上用的也就是 c with class
回过头写 c++项目 stl 不会用了 ....
across
2020-09-30 01:07:07 +08:00
还行,这还行,然后某一天,你需要写 JavaScript...... 😏
Mohanson
2020-09-30 01:10:05 +08:00
喜欢 c,写 c 的时候脑子里能实时想象出对应的机器码和内存布局,cpp 不行
AJQA
2020-09-30 01:11:56 +08:00
@luodaoyi c with class 是什么?
asuraa
2020-09-30 01:24:05 +08:00
@virtuemartx 大概就是 c++ 98
woncode
2020-09-30 01:56:15 +08:00
所以 c++是不是高级语言中最复杂最混乱的?
fwee
2020-09-30 02:00:14 +08:00
一直认为 C 是最好的语言,抽象层次正好够用。用更高级的语言就会有失去掌控感的感觉。
wangyzj
2020-09-30 02:06:43 +08:00
入前端坑吗?
feast
2020-09-30 02:16:19 +08:00
C 艹不折磨人岂不是浪得虚名? Object 型语言都这样,你需要转换一下你的思路
calmzhu
2020-09-30 03:08:46 +08:00
多崩崩就习惯了
aijam
2020-09-30 04:07:50 +08:00
建议看看 the c++ programming language 第 2/3/4 章,感觉 lz 提的问题基本都 cover 了。
ryd994
2020-09-30 04:45:21 +08:00
@virtuemartx 就是把 C++当 C 用。基本上是 C,少部分借用一下 C++的标准类,比如 list/map 。基本不定义新类,不利用 construct 之类的 C++类特性。
billyzs
2020-09-30 04:59:38 +08:00
> 第一是 c++對 type 的要求非常嚴格,類似在 C 中 void *這樣的儲存是絕對不允許的
compiler 层面并没有不允许 void*吧?我司就是 void*满天飞。当然更 idomatic 的做法是 std::any

> 也是搞不懂上面講的 template,一直不懂怎麼在 wrapper class 當中放下那麼多型別的資料,後來才發現需要依賴類似 std::variant 這樣的方法。
个人觉得使用 variant 的体验远好于 C 的 union 。真的需要管理很多 additive type 的话 compiler 一定做得比我手动去管理来的好
> ownership 的控制,什麼時候可以用一下 raw pointer 不是什麼地方都要堅持只能用新的 smart pointer
很少写 C,好奇 C 有这个问题吗? CPP core guideline 建议是不用 raw new/delete, 并没说不能用 raw pointer

> 得知了 RVO 這樣的東西
billyzs
2020-09-30 05:01:34 +08:00
@billyzs
> 得知了 RVO 這樣的東西
近 20 年的 C compiler 大部分也都实现了 RVO,C++17 不过是把 NRVO 写进了 standard 。左值右值倒是真的有点绕
msg7086
2020-09-30 06:37:51 +08:00
才到智能指针这些吗?

再往后看看,C++20 那些花里胡哨的东西,你甚至可以把 C++代码写成 Python with pointers 。
Mutoo
2020-09-30 06:45:53 +08:00
C++11 之后叫 modern C++,加入了很多新特性,基本上是新的语言了。
这两个手册可以帮新手解惑
https://github.com/lefticus/cppbestpractices
https://github.com/isocpp/CppCoreGuidelines
Cooky
2020-09-30 07:41:43 +08:00
学下 Python 放松一下?
Mithril
2020-09-30 08:39:28 +08:00
C++的套路就是保持静态类型语言的基础不变,功能上尽量向动态类型语言靠拢,估计大佬们也知道动态类型才是生产力。
不过我已经跟我的之上妥协了,新标准已经啃不动了,只能是 C with Class 这样混日子而已。
k9982874
2020-09-30 08:46:29 +08:00
先膜拜一下给内核提补丁的大佬。一切设计都是在应对某种场景,一但脱离场景都会很另类。
不得不说,目前的“现代”编程语言都是在给 C 打补丁,弥补 C 在开发或工程上的不足,包括 C++。
levelworm
2020-09-30 08:47:43 +08:00
看 Effective C++,尤其是第二版,会有相当收获。写 C 出身肯定功底不错,习惯 C++也就是时间问题。

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

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

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

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

© 2021 V2EX