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

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 。

补充:copy constructor 忘記寫了,在第五條的描述場景下也是要 declare 的

luodaoyi:我也是 经常写 windows 内核 基本上用的也就是 c with class
回过头写 c++项目 stl 不会用了 ....

across:还行,这还行,然后某一天,你需要写 JavaScript...... ?

Mohanson:喜欢 c,写 c 的时候脑子里能实时想象出对应的机器码和内存布局,cpp 不行

virtuemartx:@luodaoyi c with class 是什么?

luodaoyi:@virtuemartx 大概就是 c++ 98

woncode:所以 c++是不是高级语言中最复杂最混乱的?

fwee:一直认为 C 是最好的语言,抽象层次正好够用。用更高级的语言就会有失去掌控感的感觉。

wangyzj:入前端坑吗?

feast:C 艹不折磨人岂不是浪得虚名? Object 型语言都这样,你需要转换一下你的思路

calmzhu:多崩崩就习惯了

aijam:建议看看 the c++ programming language 第 2/3/4 章,感觉 lz 提的问题基本都 cover 了。

ryd994:@virtuemartx 就是把 C++当 C 用。基本上是 C,少部分借用一下 C++的标准类,比如 list/map 。基本不定义新类,不利用 construct 之类的 C++类特性。

billyzs:> 第一是 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:@billyzs
> 得知了 RVO 這樣的東西
近 20 年的 C compiler 大部分也都实现了 RVO,C++17 不过是把 NRVO 写进了 standard 。左值右值倒是真的有点绕

msg7086:才到智能指针这些吗?

再往后看看,C++20 那些花里胡哨的东西,你甚至可以把 C++代码写成 Python with pointers 。

Mutoo:C++11 之后叫 modern C++,加入了很多新特性,基本上是新的语言了。
这两个手册可以帮新手解惑
https://github.com/lefticus/cppbestpractices
https://github.com/isocpp/CppCoreGuidelines

一键拷贝常用动画效果 CSS 代码

jeffjade:CSSFX,一个 CSS 动效相关的网站: https://cssfx.lovejade.cn/ 。她集合 Web 开发中常用的动画效果,如鼠标悬停、输入框获取焦点、加载、以及其他动画;不仅有展示效果,并提供一键拷贝至剪切板,以便您可以在自己的项目中使用。 备注:这个项目是基于 GitHub 的一个项目( CSSFX ?) fork 而来,…

敲代码时,不知不觉背部就紧张了起来

magicianjaychou:敲代码时,不知不觉背部就紧张了起来意识到以后主动放松下来,会感到很累这段时间经常这样,大家有过类似的经历吗?

上海有哪些地方适合周末抱着电脑去写代码,大佬们周末休息时间一般去哪写代码呢

zhanbiqiyu:想周末出去写代码,自己一个人在家宅着感觉要废了,想周末找个地方可以看看书写代码,上海的大佬们一般去哪里呢,有不错的地方可以推荐下,谢谢大佬wushigejiajia01:周末了 就歇会儿吧

观摩一段简单粗暴的 vue 代码

px920906:是一个 vue 的 updated 生命周期钩子: updated () { let tx = document.getElementsByClassName('textContent'); for (let jj = 0; jj < tx.length; jj++) { while (tx[jj].offsetHeight <…

我想问下,一般大型的数据库,你们公司都有文档吗?

galileo1214:接手一个没文档的库,太难了kop1989:数据结构设计不管大型不大型,肯定要有文档的。否则整个数据库的字段和逻辑就是黑盒。不可能为了反推数据库表结构的意义去爬代码,效率太低而且正确性不能保证。 galileo1214:@kop1989 一天 2000w 的数据,没文档,心累