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

9062 次点击
所在节点    C++
48 条回复
killerirving
2020-09-30 09:07:36 +08:00
Go 才是真正的“C++”,C++应该改名 C++++++++++++++++。
shakespark
2020-09-30 09:22:28 +08:00
c++是真的难,各种语法特性,c++11 及以后就是一门新的语言
huiyifyj
2020-09-30 09:26:12 +08:00
@killerirving @21
你这是放鱼饵,钓那些骂 go 的人吧?🤣
bitdepth
2020-09-30 09:31:09 +08:00
@billyzs
1. 公司其實很隨便,因為沒人懂。但是在教我的地方這樣寫給他們看,會被幹死
2. 這邊還要搭配 std::visit 才有用,有點傻眼
3. C 沒有智能指標,記住要 free 就好了
4. 昨天大家討論結果是 C 好像是沒有 RVO,而且 Linux kernel 目前還是要求 gcc 8 能編譯過。這樣假設會在 maillist 中被幹死。
cmdOptionKana
2020-09-30 09:45:45 +08:00
感觉 C++最大的问题是太灵活了,每个人写出来的风格都很不一样。当初 Java 能在客户端 /业务市场全面制霸,其中一大原因可能就是 Java 死板,大家写出来的风格都差不多。
zjsxwc
2020-09-30 09:59:22 +08:00
c 语言和脚本语言一样自由,一下子切换到强类型无 gc 的现代 c++当然不能适应,逃
InkStone
2020-09-30 10:02:19 +08:00
我觉得还是按顺序学吧……你一上来就看 concept 和 consexpr 会感觉很奇怪,但如果是从 c++原版,11,17,20 一路看下来,那 concept 简直就是理所当然的……

同样的,C++很多特性得从 C 里找根源。比如你说的 template 和 macro,vtable 等等
Chenamy2017
2020-09-30 10:06:29 +08:00
以前没了解过 C++,我倒是觉得需要系统的学习下,C 相对 C++真的是太简洁了。
paoqi2048
2020-09-30 10:18:40 +08:00
其实 C++的很多问题都是兼容 C 兼容出来的
redme
2020-09-30 10:37:33 +08:00
++c
liukrystal
2020-09-30 12:26:04 +08:00
上了年纪就真的学不动 C++了,自 11 之后基本上就是一门新语言了,越来越像动态语言。
janus77
2020-09-30 12:52:27 +08:00
我听过一个说法:C++就是因为太自由了,所以才变得太不自由。
前者是指语言本身,后者是因为前者导致各种不可预期的问题,所以在实际开发中才需要各种严格规定以保证项目的稳步进行。
arrayJY
2020-09-30 13:10:12 +08:00
constexpr metaprogamming 比纯 template metaprogramming 好看多。

至于 pointer 问题,这就是 Cpp 为了兼容 C 而不得不留的坑,除非有 nullptr 否则我一律当 pointer 不存在
whorusq
2020-09-30 13:41:24 +08:00
@woncode 不是,听说学了 rust 再来搞 c++ 更 easy
leavic
2020-09-30 13:41:37 +08:00
九评 c++了解一下
willww64
2020-09-30 14:46:11 +08:00
@luodaoyi 写 Windows 内核?微软大佬 v
hoyixi
2020-09-30 14:51:52 +08:00
很多编程语言近 10 年的发展,感觉就是不断地挖坑埋自己。
缝缝补补,挖个大坑埋几个小坑,挖 10 个小坑埋一个大坑。Node/Javascript 生态圈尤其典型
hejingyuan199
2020-09-30 15:06:46 +08:00
哈哈,提问者和大部分回答者不在一个层次上,所以看到了一些答非所问。。。
我觉得楼主的问题只是一些个人心得,而不是提问。。。
从楼主的问题里,我学到了很多。
roundgis
2020-09-30 15:26:02 +08:00
@woncode 比不上 scala 複雜
c0011
2020-09-30 15:42:12 +08:00
@hoyixi 主要是考虑兼容性,我就想这个兼容性不能不考虑吗。。。

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

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

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

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

© 2021 V2EX