| |
首页 淘股吧 股票涨跌实时统计 涨停板选股 股票入门 股票书籍 股票问答 分时图选股 跌停板选股 K线图选股 成交量选股 [平安银行] |
股市论谈 均线选股 趋势线选股 筹码理论 波浪理论 缠论 MACD指标 KDJ指标 BOLL指标 RSI指标 炒股基础知识 炒股故事 |
商业财经 科技知识 汽车百科 工程技术 自然科学 家居生活 设计艺术 财经视频 游戏-- |
天天财汇 -> 科技知识 -> 如何评价C++世界中的众多老古董? -> 正文阅读 |
|
[科技知识]如何评价C++世界中的众多老古董? |
[收藏本文] 【下载本文】 |
一般可能都上年纪了,基本上就是张口闭口的c with class,连c++98估计都不见得会什么,但凡看见一点不会的语法,如lambda,智能指针,形… |
作为老员工,我这边看到的情况正好相反:最近新招的员工会 C++11 的不少。但是,对于这些新特性,把握不住,驾驭不了。 举几个我自己碰到过的例子,看看对你是否有帮助: lambda 这东西好用,但是有个小伙动不动就用[&]。准确地说,要么是[],要么是[&]。跟他讲道理,他跟我争论编译器会自动优化掉的。而且以前遇到编译问题都是加[&]解决的。 const 这种算是很古老特性了吧,有个小伙自己写的代码编译不过,然后把接口中的const去掉。然后顺便再去改几十处老代码,然后就编译过了。问他修改的理由,他说他觉得原来的接口有问题,导致他的代码编不过,所以他帮我改了——看他这意思还希望我夸夸!? 一小伙遇到一个进程crash问题,搞了一周找不出问题。最后Leader拉我去擦屁股。我一看代码直接麻了:这小伙的代码里到处都是智能指针。包括其他模块传过来的临时借用的对象。问他的代码里对象生命的周期怎么控制的,对象从属关系等等。答曰,直接用智能指针就可以了,不需要考虑。然后就给我科普几种智能指针的差别。 听说 C++11 有了右值引用,所以可以直接返回容器了。一小伙的代码里面就不在用指针和引用了。然后一个自定义的矩阵对象,直接内存异常。被其他人抓到问题后,让他修改。他百思不解,就拿过来问我到底问题在哪里。问了一下他自己的理解:原来他不了解右值引用构造和复制是干嘛用的。 tuple 好用吧,然后一小伙直接写了个8个成员的巨长的tuple。我 review 的时候给他提出来。他说不想再单独定义一个struct,tuple更简单。我看着那一堆的0、1、2、3、4、5、6、7 给他讲了一个多小时的代码可维护性是咋回事,然后他突然就悟了,说看来这些数字应该用enum class定义一下。 lambda 又想起一个:一小伙直接在一个函数里用了写了两个巨大的lambda。整个函数就除了十几其他代码,就剩下这两个lambda。他觉得,后面的两处函数调用各需要传入一 个function 参数,所以他就直接写了 lambda 函数了。 ————— 不说了,好不容易起个早,太多负能量了。 ————— 我感觉我就是你说的这样的老古董,我也确实经常跟这些小伙说: 多去看编程规范(我们内部定的) 没有充足的理由不要给我改老接口 拿不准的特性就不要用,放心,不会累s的 热点处理的代码,给我用原始的指针传数据,每个指针都给我先加上ASSERT再说。 除了UT代码可以随便折腾,业务代码不要硬套C++11的用法 接口层给我老老实实用C++98的特性和内部明确可以用的特性 软件行为不符合预期,首先全量重新编译一下,并把所有编译warning清掉,再看看 提代码前,本地把用例跑过,上主线前自己跑用例的时候开valgrind抓下内存问题 ...... 或许您可以和你们团队的老古董们沟通下,看看真实原因是什么。 送礼物 还没有人送礼物,鼓励一下作者吧 |
新人就好很多吗?我知道一个人目测接触2年左右的C++然后去学某语言,觉得C++ ub多,又说不出来到底哪里ub了,然后张嘴就要C++死(原话),自动忽略了C。乱学一通就觉得自己接触的是事实,作为垃圾教材受害者还不自知的人有的是。 C++11比C++98在核心上最大的改进是移动(原子操作不常用),剩下的以语法糖和库改进为主,真会C++98的人不可能会拒绝C++11。 |
我很老但是还在学习C++新特性。但自从有了Qt后,明显变懒了很多。最近在学习Qt的协程库 QCoro,当然用pthread写多线程还是我的最爱。 要反过来想,C++允许老古董存在,说明这门语言非常包容,其他领域老古董早就被优化去跑网约车了。另外,不少C++老古董其实是C的精英,这些人习惯了malloc和free以及typedef struct ...,只是用了C++的编译器,其实还是C的脑瓜子。曾经见过一个做模式识别的代码,虽然有了C++,非要把算法写到全局,外加一堆std::vector全局的变量。结果你猜咋了,他用vector是这样用的:
所有的vector都要转换为指针再用。 我问他为啥,说摸不着内存,虚得慌。 我又问他,那你干嘛不直接用new或者malloc,他说vector会自己释放。 我又说,这种正确的打开方式是 shared_ptr 他说,shared_ptr无法自增。 我又说:vector自增后,data()地址可能改变,你就挂了。 他说:所以我每次push_back后都会刷新指针。 而后我就无语啦。不过,他的算法性能超级好,这也许弥补了他代码的缺陷。另外,我教会了他用valgrind,这样可以好很多。 送礼物 还没有人送礼物,鼓励一下作者吧 |
主要是很多问题老人用老方法解决得很好,为啥需要改呢? c++11真正的好东西是原生线程库(pthread是真的阴间)、thread local存储期(神,不需要解释,通用线程池的好搭档,大型线程私有变量难道你call一次worker构造一次?还是在worker外面传来传去传的马都不认识?还是只构造一个,然后上一堆同步锁?)、string(再怎么喷也掩盖不了人家就是比char星好用的事实,尤其是对新手,对内置方法不满意你完全可以把它的指针掏出来自己实现新算法,再说短string直接构造在栈上,你的堆分配字符串数组怎么都打不过人家的性能,栈分配的话:您好,我们的这个字符串绝大多数情况很短,但是它有时候会很长,你要不要自己实现一个动态分配的东西?)、引用语法、右值、生命周期控制之类的东西。 当然我现在都已经改到c++17了,原因有三个:1.string_view真是yyds,2.bool型的++算符终于他妈的非法了,就不应该容忍这种行为。。3.不再支持寄存器变量,终于可以干掉某些自以为是的行为了,有本事就直接写asm,没本事的就老老实实。 |
反正我们的代码里,禁止出现tuple,允许出现非常短的lambda,参数能加const就加const,分清楚借用和转移所有权。能用容器的地方不用指针,就这oda关闭的时候有一个崩溃,我还没找到。 |
我们组基本都是老古董,目前是用全了c++17的新特性。非必要不显式使用memset,memcpy,malloc之类的函数。 |
我可能就是C++世界中众多老古董的一员,与题主所描述的不同是,我虽很少用或者说有点抵触lambda和智能指针等,但别人用我不会表达任何意见,既不支持也不反对。不支持是因为我本身不喜欢用,不反对是因为我觉得那是人家的权利。 我之所以用c++而不是java,就是因为我享受那种操控感,我申请出来的内存怎么用全在我的掌握中,我写的每一个函数每一行代码,我都清清楚楚明明白白。而且,我希望所有能看到代码的人,不管他是有100年c++经验还是刚刚接触c++的菜鸟,都能看明白我的代码。我希望他们不需要因为要看懂我的代码而去学习他之前不熟悉的语法。 很多人说,不要用new和delete,不要用memcpy和memset,要用现代c++标准库,编译器自己会在合适的时候自己调用或者会优化成调用这些函数等等。这玩意又不复杂,自己写能看得到能摸得着,清清楚楚明明白白的,这有什么不好?明明自己可以搞的东西,为什么还要让编译器或什么库自己找合适的时机处理?他们认为“合适的时机”真的是你心中想的那个时机吗? 原始的c++就象跑车,追求速度、性能和操控性,深得年轻人的喜爱;现代c++就象商务车,主要追求舒适性,无疑是中老年人的至爱。明白了不?言必c++23的人,年纪轻轻的就放弃操控性,追求舒适性,只能说明心态已老了。 c++23能跑得开的地方,c++98基本上也能跑得开。但,c++98能跑得欢的地方,c++23很可能行不通。闲着没事玩玩c++23值得肯定,但如果在项目中直接使用c++23,就是把路走窄了。 在构造函数申请的资源,在析构函数中释放;在函数进入时申请的资源,在函数退出时释放;前面new A、new B和new C,后面就是delete C、delete B和delete A,在用引用记数时也是这样的原则。这是工程上的规范,简简单单的原则就能避免资源泄漏,这也是一种代码美学。 |
C++就是看上去封装了,反正标准委员会也不管你怎么实现,那有些东西就是icc过不去gnu一把梭你找谁说理去? 还有lambda,你一个lambda弄40行再套40行几个意思?P(ython)瘾犯了是不是? |
对所谓modern c++,要区分对待: 有些特性,虽然是近几年才引入,但却是老c++精神的延续与发展。对这类特性,要大用特用。用了立即简化代码、减轻痛苦,为什么不用?而有些特性,虽然挂着modern的羊头,其实贩卖的是自stl开始跑偏的泛型编程,目前名为元编程。对这类特性,要旗帜鲜明反对,学都不学。 不是元编程没用,而是元编程能力对于c++纯属意外,导致难看又难用。 折腾一个难用又没多大用的东西,就好比你非要在网不好的时候上网。别跟自己过不去。 然后一帮子老人,一帮子长期脱离了业务场景,脱离了具体平台,单纯操弄编程语言及其编译器跟程序库的老人,铁了头,沿着30年前确立的modern路线继续深入, 带得一帮子连编程是为干啥都没搞明白的初学者,一头扎入老人们钻了30年的深坑,学完即废。在这坑里,大爷们永远是你大爷,永远是年轻。 你要想毁一个人,就忽悠他学c++元编程,噢,modern c++。 |
有的人为新而新,也是大问题,比如到处std::move。实际项目开发中,因为语法问题被难倒的没有,被性能难倒的比比皆是。玩C++要去追求高性能算法,很多不痛不痒的语言特性对性能没有什么影响,比如面试经常考的i++和++i的性能开销、虚函数的性能开销等等,99%以上的代码根本触及不到这些问题。 送礼物 还没有人送礼物,鼓励一下作者吧 |
懂得多,并不比懂得深有用。更何况你使用众多的新特性时,你并不见得正确使用了,你的同事也不比你懂得多,对你的代码做code review也挺难。 |
完全合理正常的。 如果你长期开发维护过项目就应该清楚,一个好的c++代码风格才是一个项目活下去必须要的要素,否则代码是无法维护的。要做到,同事能轻易维护你的代码,你也能轻易维护同事的代码。 比如lambda,一般都是禁用,因为可能有人写出“回调地狱”那种写法,可读性和维护都是严重的负担。当然你要写一些小工具,用也没错。 至于智能指针,那还是看具体项目吧,unique_ptr可以随便用,shared_ptr我的大部分项目是禁用的。 一般看到那种只会梭stl,一上来就是shared_ptr的选手,净量还是别招。c++最宝贵的能力是如何调试崩溃dump,尤其是大型项目,单看栈很可能是看不出问题来的。还在纠结语法只能说还没入门。 |
我认为的几个原因吧 一,懒,懒得学,学也累。现在都C++23了,把新增东西学完,还能灵活运用,少说也要一两年,然后下一个C++标准又来了。 二,学新技术很可能不能增加不可替代性,毕竟总有大佬,总有年轻人。业务能力才是赚钱的手段,技术只是一个敲门砖。现如今车贷房贷孩子加起来,有时间学习技术,不如学业务,接触多,公司需要,不需要额外时间,边上班边学。 三,一部分人并不是想搞技术,而是技术转管理,那又是另一码事了。 |
Having said all this, there are, unfortunately, some people who have the return-code-mindset burned so deeply into their psyche that they just can’t seem to see any alternatives. If that is you, there is still hope: get a mentor. If you see it done right, you’ll probably get it. Style is sometimes caught, not just taught. 这是 isocpp 上关于异常的讨论,讲的是某些人的守旧是根深蒂固的。他们对于新事物本身就抱有抗拒的心理,更别说正确地使用新事物了,既然使用都不正确,眼里只有缺点,怎么能接受呢? 其实工具本身就应该是为目的服务的,工具用的好不好在于人,总不能拿着锤子拧螺丝说锤子不好用吧。 |
这个世界上有跟不上革新速度的人很正常,而这些人逐渐被时代淘汰也很正常。 其他的话都不必多说,说一千道一万,各种话不都是为了自己呆在舒适圈里找借口么。 听多了反而觉得厌烦。 你不如就明明白白地说我学不动了,就现在这个用着挺舒服的,这样至少别人会觉得你是个有自知之明的老古董,而不是一个死鸭子嘴硬的老古董。 |
我在20年前推广C++98时就遇到过了,不是老人变坏了,是坏人变老了。 |
对于这点不能一概而论,评价一件事情对与不对或者中性,要从时间、地点、人、业务背景出发。 这不禁让我想起工作中的一个场景,某服务要从物理机迁移到云上,c++的rpc框架也要做迁移,这时出现了一个geek的小伙伴,大谈特谈新特性,移动语义,lambda表达式。作为项目负责人,关心自然不是这些,无论用不用新特性,明确迁移方案、备份计划即使是用c++98的语法写,并无大碍。 换一个场景,业务并无紧急需求,团队有时间去做一些沉淀的事情,这个时候针对业务场景的需求,提升性能,沉淀基础库,增加基础库鲁棒性和支持功能的场景,这时候大谈方案、大谈ROI,难免让人怀疑没有技术深度,属于纯管理leader了。 |
我觉得一般是吃过旧语法的苦,才会喜欢新语法。 |
不懂业务,不懂算法,甚至不懂计算机原理的C++语言律师? |
独孤求败40岁反而用木剑呢,所以我建议大家都写C语言。 |
你们不是天天抱怨程序员技术迭代太快需要不停学习吗 |
|
[收藏本文] 【下载本文】 |
科技知识 最新文章 |
百度为什么越来越垃圾了? |
百度为什么越来越垃圾了? |
为什么程序员总是发现不了自己的Bug? |
出现在抖音评论区里边的算命真不真? |
你认为 C++ 最不应该存在的特性是什么? |
为什么 Windows 的兼容性这么强大,到底用了 |
如何看待Nvidia禁止使用翻译工具将cuda运行 |
为何苹果搞了十年的汽车还是难产,小米很快 |
该不该和AI说谢谢? |
为什么突破性的技术总是最先发生在西方? |
上一篇文章 下一篇文章 查看所有文章 |
|
|
股票涨跌实时统计 涨停板选股 分时图选股 跌停板选股 K线图选股 成交量选股 均线选股 趋势线选股 筹码理论 波浪理论 缠论 MACD指标 KDJ指标 BOLL指标 RSI指标 炒股基础知识 炒股故事 |
网站联系: qq:121756557 email:121756557@qq.com 天天财汇 |