`

不要在C++的复杂细节上浪费太多生命,请

阅读更多

今晚在水木上看到一个帖子,我转载一下楼主的问题:

class CA
{
public:
 void a(){};
};

void fun()
{
 CA a;
 int n1=sizeof(a);
//这里n1是1,为什么?
}

  大家不要花太多时间去想上面这个问题啊。我知道这个问题有些吸引人,也许未来有一天你去某个知名企业面试,面试官会很得意的问你,这是为什么啊。但是,请真的不要过多的去想这个问题,为什么呢?因为在我接近9年的C++经验中(有接近5年的电信领域工作经验),我没有关注过sizeof。

 

  问题接着就来了,为什么不关注呢,难道你不关注你对象的大小吗?我当然关注,而且很关注,可惜的是我明白sizeof(T)不能反应这个类型耗用的内存量,不信你可以sizeof(a_string_obj),你就知道我的意思了。那知道sizeof(n1) =1毫无用处吗?不是的,有一丁点,在你察看core dump文件的时候1/00000或者1/100000的时候用的上:) 不是知道它等于1有用(实际上标准没有规定它==1,而是知道它可能不等于0有用)。

 

      C++真的很繁琐很复杂,但实际上大部分都是我们人为造成的:

(1) 很多书籍介绍了一些trick,当然可能N个教条里面确实有几条是有用的;

(2) 面试的时候喜欢问一些问题。譬如vtable如何实现的啊?

(3) 对知识的贪图心态。

 

其实造成这些问题的最大原因,就是我们没有想清楚问题。C++被设计出来是编程序的,写程序是为了解决实际的问题的。换句话说,C++,或者任何一们语言的最终目的是为了更好的帮你解决实际中的问题的。那么知道这些,就好办了。学习C++的过程中,反复的问自己或者有经验的工程师,如果用C++更好的解决你的问题,什么才是C++最本质的难点。我结合我实际工作经验给出一些我的看法:

(1) 内存管理,很难。不是你说的你new一个,忘记delete了;或者异常没弄好,你delete不了。那不是难,那是编程错误。难得是在:内存碎片,库里面的内存泄露或者错误读写。解决方法是:选用好的内存分配库或者GC。其实这个问题还没有这么简单,也许你的内存管理库或者GC会和你的标准库的内存分配策略矛盾,造成很多隐晦的Bug,非常难解决和定位。但是,这样做通常会比你自己去写内存分配池好很多,毕竟成熟的库用了很长时间了。

(2) 生命周期。这是一个很难的问题,不信你可以尝试实现一个Logger,你就会发现这个问题有多复杂。我们考虑一下,如果你在atexit注册的函数被调用的时候,都需要logger,你就会明白这件事情的复杂性。我们解决的方法就是,大家规定好初始化的顺序,譬如最先是logger,然后是数据库链接。释放的时候反方向,整个team都遵循。之后任何人如果想往里面添东西,都需要设计好很多用例来好好的测试。

(3) 内存模型。这个东西对于并发程序非常重要,比上面任何一个都重要。为什么?因为即使你跑了上百天压力测试,你也可能在上线后一天内core掉。我知道上百天测试之后,你的coverage已经很高了。解决方法:放弃你对violatile的信任,老老实实用锁。你可以使用mutex或者RWLock,或者condition, semphone都可以。如果你对性能很看重,使用平台专用的原语,memory barrier和atomic类型(但是后面的代码一定是十分少的,如果不是这样,你要审视你的设计)。使用一些Lint工具,有助于减少你犯错的可能。但是你唯一能信任的是:Lint报了错误的,你要认真检查;即使Lint全部过,依然可能有问题。

 

没有了?没有了。如果还有,那就是你需要放弃你内心“强大的求知欲望“,踏踏实实的做一个”普普通通“的C++程序员。我知道template很精彩,0x里面的static_assert, lamada很好玩,不过相信我,短时间内那个不属于工业界(除了内存模型和thread库)。还是那句话,直面你的问题,用最简单的设计和编码解决它,让你的设计和代码很容易被理解。(说到这里,也许有朋友会说,你自己还去看0x。其实你也可以去看,去学习,但是实际中请务必清醒的认识到,什么才是本质。如果你做不到这一点,那就不要去看了。因为看的越多,你越不会写代码)。

 

分享到:
评论

相关推荐

    C++C++C++C++C++C++C++

    C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++

    C++语言导学 A Tour of C++(C++之父写的入门书)

    《计算机科学丛书:C++语言导学》作者是C++语言的设计者和最初实现者,...本书没有涉及太多C++语言的细节,非常适合想熟悉C++语言最新特性的C/C++程序设计人员以及精通其他高级语言而想了解C++语言特性和优点的人员。

    C++语言导学PDF

    《计算机科学丛书:C++语言导学》作者是C++语言的设计者和最初实现者,...本书没有涉及太多C++语言的细节,非常适合想熟悉C++语言最新特性的C/C++程序设计人员以及精通其他高级语言而想了解C++语言特性和优点的人员。

    Effective Modern C++:改善C++11和C++14的42个具体做法(中文版 + 英文版)

    压缩包中包括英文版与中文版, 中文版为爱好者自发翻译...他对复杂技术资料的清楚且引人入胜的解释为他在全世界范围内赢得了拥趸,使他成为炙手可热的培训师、顾问和会议演讲者。他拥有布朗大学的计算 机科学博士学位。

    c++分屏显示接口,c++分屏显示接口

    c++实现将窗体移动到扩展显示器,默认系统设置主窗口在最左边,扩展窗口在右侧。需一定的基础,小白请不要下载,以免浪费。

    More Effective C++.pdf

    在如此庞大复杂的机制下,万千使用者前仆後续的动力是:一旦学成,妙用无穷。C++ 相关书籍之多,车载斗量;如天上繁星,如过江之鲫。广博如四库全书者有之(The C++ Programming Language、C++ Primer),深奥如...

    c++笔试面试之网络和多线程

    该文档是我总结的c++笔试面试通常会问的一些问题。另外可以从我的资源目录下找c++数据结构与算法,c++笔试面试基础两部分材料,综合这三个材料一起看,我相信大家一定尽快找到工作。

    C++基础教程完整版

    同样对于C和C++在实现上有明显不同的概念,将备用如下标志标出: C 与 C++不同的地方 编译器 本教程中所有例题程序均为console程序(控制台程序)。此类程序以文本形式与用户交换信息,显示结果。 所有C++编译器均...

    《谭浩强C++程序设计》

    但是,由于C++涉及概念很多,语法比较复杂,内容十分广泛,使不少人感到学习难度较大,难以入门。 考虑到许多读者在学习C++前未学过其他语言,本书把入门起点降低,读者不需要具备C语言的基础。本书包括14章,...

    理解复杂的C++声明

    教你理解复杂的C++声明

    Nurbs曲线C++实现

    Nurbs 曲线 C++Nurbs 曲线 C++

    C++多线程例子

    一份基础的关于C++的多线程编程例子,对于初学C++的多线程编程有帮助

    c c++ 笔试 面试题 超多超经典

    c c++ 笔试 面试题 超多超经典c c++ 笔试 面试题 超多超经典c c++ 笔试 面试题 超多超经典c c++ 笔试 面试题 超多超经典c c++ 笔试 面试题 超多超经典

    黑马程序员c++配套课件 《轻松搞定c++语言》

    黑马程序员c++配套课件 《轻松搞定c++语言》 黑马程序员c++配套课件 《轻松搞定c++语言》

    c++多线程源码

    c++多线程系列,配套博客地址:http://blog.csdn.net/richerg85/article/details/7450818

    C++ API chm C++ API chm C++ API chm

    C++ API chm C++ API chm C++ API chm C++ API chm C++ API chm C++ API chm

    [MFC/C++]生命游戏(使用GDI/文件读写/多线程)

    C++编写的生命游戏,进行细胞生存模拟,基于MFC,运用GDI 文件操作 多线程,附带几个演示的文件,下载后可以打开程序 载入演示文件进行演示,包含源代码。

    Visual C++.NET案例开发集锦

    涵盖了C++编程基础、图形图像处理、多媒体应用、系统文件处理、硬件的控制、数据库、网络处理等多个方面,本着循序渐进、因势利导的方式为读者一步步由浅入深、由简单到复杂、由示例到原理、由原理到应用地解析...

    LSTM C++源代码

    https://blog.csdn.net/u012465304/article/details/82656803 我的博客上的LSTM例程,用c++写的,由于找我私聊要的人太多了,就上传到这个上面,大家可自行下载

    json字符串转换c++类对象

    json 字符串转成c++类对象,json 字符串转成c++类对象

Global site tag (gtag.js) - Google Analytics