c++在公司里一般是做什么的啊

2021-08-30 20:29:04 +08:00
 zxCoder
15923 次点击
所在节点    C++
107 条回复
ipwx
2021-09-01 11:35:58 +08:00
@shijingshijing (正常写函数都不敢循环嵌套三层, 不然根本没法维护)
bruce0
2021-09-01 13:45:18 +08:00
@ipwx 我理解的 template 会有 undeterministic 原因. 是因为使用了 template 后,代码是编译器生成的,(不同的编译器还有不同的实现方式)不是程序员手写的,可以了认为是潜在不可控的。

当然,C++ 构造函数,还有深拷贝,浅拷贝等等容易出错的坑。

所有 Linus 经常喷 C++是一门辣鸡语言
ipwx
2021-09-01 14:08:51 +08:00
@bruce0 可是,C++ 的 zero-abstraction 是有规范的啊。

在 template 方面根本就没有 UB 。如果你认为不是手写的就是 undeterministic,我觉得你应该用机器码才行啊。
ipwx
2021-09-01 14:10:00 +08:00
@bruce0 构造函数、深拷贝、浅拷贝,进化到 C++17 就是 move 语法等等。这些都是有规范的,一个能通过各种测试的编译器,用这些高级特性你都知道会发生什么。包括 -O3 。写出没有 Undefined Behaviour (遵守规范所以编译器也能给你完全能控制的代码)是 C++ 程序员重要的基本功啊。
ipwx
2021-09-01 14:17:30 +08:00
@bruce0 哦对用机器码也不保险。

如果你用的是通用芯片,现代通用芯片在机器码的下面都有很多你“控制不了”的行为。比如英特尔的芯片微指令,一个机器指令其实是拆成若干指令,然后在芯片上有指令流水线(同一瞬间其实有多个指令的不同步骤正在执行)。这些指令“并行”会导致一些 data harzard 。当然,芯片帮我们处理好了。

但是因为是并行流水线所以会带来一些其他问题。比如遇到条件判断,现代芯片都会猜测这条语句的结果,然后提前进入某个分支执行。如果猜错了就“回滚”。对,分值预测就会导致你“执行时间不可控”。

还有比如 cacheline 、L1~L3 cache,atomic 指令,store buffer queue (在一个核上非 atomic 指令更新数据,另一个核不一定马上能看到)。这些都是你“不可控”的抽象。

----

现代计算机就是在一层一层你不可控的抽象上建立起来的。C++ 的各种语法和芯片上的这些复杂机制并没有本质差别。要理解、掌握这些抽象后面的原理,利用这些抽象才对嘛。
ipwx
2021-09-01 14:20:08 +08:00
@bruce0 说起指令流水线和 data hazard 其实还可能会产生指令的乱序执行。比如老生常谈的

if (condition) {
with (lock) {
if (condition) { ...

这种 double-check-lock 在乱序执行面前会被虐成渣渣。解决方案是加入 memory fence 。

----

总之为啥 C++ 难,是因为太靠近硬件,需要掌握这些底层抽象才能用好。
wutiantong
2021-09-01 14:35:30 +08:00
@ipwx 我觉得无知者的道听途说根本配不上这么认真的回复啊
OneMan
2021-09-01 14:39:51 +08:00
嵌入式,音视频,性能强相关的,android 和 iOS 的底层一些开发,也都是 c++开发好提供接口给上层用。
bruce0
2021-09-01 15:13:17 +08:00
@ipwx 我工作不是写 C++的,只是偶尔用一下 C++,你说的很多深入的东西我也不太懂。我说不让用 template 的原因是我的理解,不一定正确(没有任何杠的意思,只是说一下我的看法)。C++相当于 C,确实会有一些容易出错的地方(特性太多了),不是这个语言不可靠,是写 C++的人,因为对 C++理解的不够深入导致的。有几个人敢说自己精通 C++,深入理解了各种实现细节。相对来说 C 就没有这么多容易出错的地方(因为特性少)

以前,看过一篇文章,说是 在汽车上写 C 程序,指针都不让用,不知道真假
spadger
2021-09-01 15:35:10 +08:00
https://www.amobbs.com/thread-5754354-1-1.html
关于下单助手 3.4.0 以后版本崩溃及内存异常等问题的情况说明
...
1 、原来为了集成各种查看实物图、SMT 贴片效果图,我们在这个小助手上集成了我们自己的一些 C++程序。
而这种 C/S 架构的方式,有 bug 的情况下,更新迭代也非常缓慢。
现在我们已经接入 EDA 团队开发的基于 WebGL 的在线图形引擎,用以替换掉原来开发的这部分 C++程序。
这样子,才能做到快速在线迭代更新。
...
shijingshijing
2021-09-01 15:44:37 +08:00
@ipwx
@bruce0
@tianming1992

这里的 undeterministic 不仅仅是指技术上的,需要用 template 实现的函数大部分都是基础库之类的,实际作用是为了一次书写,适用多种类型,这种情况理论上是没问题的,可是在实际使用过程中,可能会碰到各种意想不到的问题,比如,嵌入式里面有很多 8 位,16 位,32 位不同类型的处理器,这时候假如函数里面使用了 Magic Number 作为参数,比如上限值,很有可能当参数为 32bit INT 类型没问题,但 8 位,16 位就会有问题。(你可以 Argue 说这是程序员素质的问题,但写函数的和用函数的人保不齐有一个没注意的,这样就会带来问题)

template 可以看作是一种语法糖,爽了开发,但是让后面的测试,追踪,certification 乃至出了问题做 Failiure Analysis 不确定性、复杂度和人力成本剧增,可能导致整个项目成本剧增,因此即使有这种场景,一般也是用宏定义来实现的,高可靠性的项目就是从技术上,管理上等各个方面来进行限制,尽最大能力保证不出问题,最好是从根本上消除产生问题的可能性。

这样来看,不能使用指针,不能动态分配内存,循环嵌套不能超过三层,不能使用递归等等神奇的限制也就合乎情理了。
shijingshijing
2021-09-01 19:41:59 +08:00
@name1991 图像处理和路径规划用的“严格裁剪版 C++”,内存管理这一块 NASA 重新造了一套轮子,上两张图吧




b00tyhunt3r
2021-09-01 22:00:13 +08:00
@ipwx
他上 nasa 图了 确实写着不用 template 领先 1 分
该你反击了


(别问我,我就一不嫌事大吃瓜的🤣
ipwx
2021-09-02 00:17:09 +08:00
@shijingshijing 那行吧,只能说这是用 human labor 堆出来的重量级工程。

但凡是地球上跑的软件项目就不走这条路了,因为这要花太多人力资源。
agagega
2021-09-02 00:36:01 +08:00
@shijingshijing
我大概没见过哪个语言标准库 IO 部分比 C++的 iostream 更不讨人喜欢的了
boyhailong
2021-09-02 06:56:45 +08:00
游戏开发
shijingshijing
2021-09-02 09:32:33 +08:00
@ipwx 很多代码都是自动生成的,还有很多是复用以前经过 certification 的老项目代码,测试的时候需要的人多。要想系统可靠,就必须尽量使用简单的基础模块,然后尽可能复用,宁可简单的东西复用几万遍,也不会为了省事儿弄个新轮子,NASA 自己造内存管理的轮子是迫不得已,不然也不会用的。

这些项目里面,R&D 的 effort 只占 30%,剩下的几乎全部是 Documentation,Test,Certifiction 。
leafre
2021-09-02 09:37:26 +08:00
做各种轮子
youlemei
2021-09-02 09:41:38 +08:00
做低延迟系统
plasmetoz
2021-09-02 09:52:57 +08:00
给使用的数据库加自定义函数

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

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

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

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

© 2021 V2EX