@
Cbdy 基础设施的领域,因为开发者自身水平比较高,通常 c 也能搞定。基础设施用 c++的,牛逼的团队会限制姿势使用 c++比如只用 c with class and stl 。内存敏感的领域甚至连 stl 都是要禁的。
非基础设施的领域,因为涉及到很多更偏商业业务的,开发人员水平也有很多初级中级,所以单就 stl 讲就比纯 c 好用的多。尤其是还有很多年代背景,那个年代还是 tr1 、boost 早期阶段,没有 c++11 到 21 这些更加闹心的语言标准和姿势,那时候有很多 c++的老项目。现在仍然有很多性能敏感的偏商业业务是 c++的天下,因为 rust 还太年轻,需要一些年头去过度才能大面积取代 c++。
> 可能还有一种工程师的选择,就是不碰 C++
牛逼点的工程师,还是需要一些 c++的积累的。可以选择不用,但至少自己能够知道为什么不用、并且用其他的什么能在性能、开发效率、商业之间收获更好的平衡收益。
> C++就是碰瓷营销 C 语言,就像 JavaScript 碰瓷营销 Java 一样,把很多人都迷惑了
也不算碰瓷,c++诞生的年代,确实需要比 c 更方便一些的功能来让业务开发效率得到提升,c 是对于高手相对友好,但是复杂业务仍然门槛高,比如内核你去读源码,一个逻辑十几层的宏看着看着就忘记了从哪里过来的、非常耗费时间。cpp 相比于 java 的一大劣势是作者本身,bj 老爷子本身是偏学术型的学者而非偏商业的大佬,并且那个年代,前面的编程语言可借鉴的主要是 c,而 java 是 sun 公司搞出来的,性能其次考虑,很多特性尤其是 gc 和成熟的社区方案供给,对开发者太友好了、可以极大促进商业成功。
c++也并非失败,只是相比于稍晚辈的 java 的成功显得差一些。去年看到一篇 bj 老爷子的专访,还是比较客观的:
https://new.qq.com/omn/20201117/20201117A0988S00.html我看好 rust 逐渐在更多领域替代 cpp
> 我主语言是 java
我之前看到你说主语言是 java 了。
我讲的跟主语言没关系,而是对待 cpp 的态度。太多人沉迷于维护 cpp 的名声而不自知了。
> 2. 这楼里,你和 @
darknoll 两个刚入门的人,蹲在井底一块落砖上,却以为站在高台上指点别人,贻笑大方。走出井看看,你会发现世界不一样
我也快 40 了,十几年前最早就是开始写 c/c++ 写了好多年,现在已经不靠代码为生。至于水平,这里有我两个 go 的 repo:
https://www.v2ex.com/t/794435#reply1做的晚,宣传力度小,star 少,但你可以对比下同类 repo,再来评价我是不是刚入门:
https://github.com/cloudwego/kitex-benchmarkhttps://github.com/lesismal/go-net-benchmark《一代宗师》里「老猿挂印回首望,关隘不在挂印,而是回头」。
对于 cpp,回头的含义可以理解为:能够正视 cpp 的问题,而不是用 “如何解决 cpp 的某个问题” 来解释 “所以 cpp 没这个问题”。你用 1 分钟发 http 请求,就相当于是在用 “如何搞定发 http” 来跟别人 battle “cpp 门槛高” 的问题。
之前帖子里我没有回复也是因为懒得去 battle cpp 相关的,以前在各种老论坛、技术群跟人 battle 得太多了,对于 cpp 最清醒的大概两类人,一类是顶尖一批接近语言律师级别的大神、既能精通各种语法予以模式又能在实际业务中合理运用,一类是独孤九剑式的清醒工程师、知道什么不利于工程所以弱水三千只取 cpp 最合适的那一瓢或者几瓢来做项目。剩下的要么被 cpp 折磨要么转其他了。
介绍下自己俩库,arpc 和 nbio:
https://www.v2ex.com/t/794435#reply0这两个库可以覆盖绝大多数应用业务场景,比如:RPC 、IM 、游戏、广播 /推送服务、其他自家功能交互等。
支持 tcp/kcp/quic/websocket 各种协议作为传输载体。
单机连接数量不特别大比如 10k-100k 这种级别的(普通人眼里觉得 10k 已经算大了,但是对于网络框架而言,这个量级很小,那些性能差的脚本语言就不要来讨论性能了),配置能扛得住就默认标准库方案。
海量并发比如单机 100k-1000k 这种级别的,可以 arpc+nbio,照样能扛。
这个领域里,一是性能,二是易用性,有兴趣的同学可以自行对比。
关于性能,有兴趣的同学可以去看下鸟窝老师和字节同学的 benchmark 库,硬件不同压测结果可能存在差异,所以有兴趣的同学不要看仓库文档展示的结果,请自己机器实测看效果:
github.com/rpcxio/rpcx-benchmarkgithub.com\cloudwego\kitex-benchmark
### 一般写法,工厂方法
```golang
package main
type GameStart struct {
cloudNumber int
gameStartLayers [8]*ebiten.Image
layerPosition [8][2]float64
menuList [3]*Menu
}
func NewGameStart() *GameStart {
return &GameStart{
cloudNumber: 3,
layerPosition: [8][2]float64{
{0, 0}, {0, 0}, {0, 230}, {0, 250},
{0, 250}, {0, 0}, {0, 0}, {0, 0},
},
}
}
func main() {
var gameStart = NewGameStart()
}
```
### 如果需要 pool 优化,还可以:
```golang
package main
import (
"sync"
)
var initedGameStart = GameStart{
cloudNumber: 3,
layerPosition: [8][2]float64{
{0, 0}, {0, 0}, {0, 230}, {0, 250},
{0, 250}, {0, 0}, {0, 0}, {0, 0},
},
}
var gameStartPool = sync.Pool{
New: func() interface{} {
return &GameStart{}
},
}
type GameStart struct {
cloudNumber int
gameStartLayers [8]*ebiten.Image
layerPosition [8][2]float64
menuList [3]*Menu
}
func (v *GameStart) Release() {
// maybe you want to release gameStartLayers and menuList here
// ...
gameStartPool.Put(v)
}
func NewGameStart() *GameStart {
v := gameStartPool.Get().(*GameStart)
*v = initedGameStart
return v
}
func main() {
var gameStart = NewGameStart()
defer gameStart.Release()
}
```