`

不要在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++小游戏 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++DLL导出类

    请注意,这只是一个基本示例,实际应用中可能需要处理更复杂的情况,如错误处理、数据类型转换、多线程同步等。对于大型项目,考虑使用C++/CLI作为桥接层,它允许在.NET和C++之间直接进行互操作,无需转换为C风格的...

    深度探索c++对象模型(2012版本)

    总的来说,《深度探索C++对象模型》将带领读者深入C++的核心,理解对象模型的每一个细节,这对于提升C++编程技能,解决复杂问题和优化代码性能具有极大的价值。通过阅读本书,读者将能够更好地掌握C++这一强大工具,...

    C++语言导学PDF

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

    C++编程实例100篇

    模板是C++的一个高级特性,允许创建泛型代码,即可以在多种数据类型上工作的函数或类。模板可以提高代码的通用性,减少重复工作。 异常处理是处理程序运行时错误的方式,通过try、catch和throw关键字,可以捕获并...

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

    在C++编程中,将JSON字符串转换为C++类对象是一项常见的任务,特别是在处理网络通信、数据存储或配置文件时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析...

    C++求导算法和实现

    在C++中,求导可以用于优化问题、拟合曲线、机器学习等多个领域。求导算法大致分为两类:解析求导和数值求导。 1. 解析求导:对于已知解析表达式的函数,我们可以直接通过链式法则和幂规则等求导法则进行计算。在...

    mediacodec c++.

    在Android平台上,MediaCodec是一个关键的API,用于处理多媒体数据编码和解码。它支持硬件加速,可以在低功耗下高效地处理视频和音频。...但同时也需要处理更多的底层细节,如错误处理、同步机制以及兼容性问题。

    c++实现多层神经网络

    在本项目中,我们探讨了如何使用C++编程语言实现一个多层神经网络。C++是一种高效、静态类型的系统级编程语言,它允许开发者对内存管理有精细的控制,因此非常适合构建复杂的计算密集型应用程序,如神经网络。 首先...

    《C++ for Java Programmers》高清完整英文PDF版

    此外,还讨论了C++与Java在语法上的一些不同点。 知识点四:函数、数组、字符串与参数传递。书中讲解了C++中的函数定义与调用、函数重载、默认参数、内联函数和单独编译。同时对数组和字符串的使用、多维数组以及...

    c++多线程源码

    在C++11及更高版本中,标准库提供了对多线程的支持,使得开发者可以方便地创建和管理线程。 在C++中,创建线程主要有两个关键类:`std::thread`和`std::mutex`。`std::thread`用于创建和启动新线程,而`std::mutex`...

    一个免费的c++小游戏集合

    C++是一种强大的、通用的面向对象编程语言,以其高效性和灵活性闻名,广泛应用于游戏开发、系统软件、嵌入式系统以及各种复杂应用的后端开发。 首先,让我们来探讨C++在游戏开发中的应用。C++的性能优势使得它成为...

    c++builder控件大全

    在深入探讨《C++Builder控件大全》一书之前,首先需要了解C++Builder这一集成开发环境(IDE)的基本概念。C++Builder是由BORLAND公司开发的一个RAD工具,它集成了高效灵活的C++语言与Windows可视化编程技术,并且在...

    实用C++的CHM集合

    2. **C++ Network Programming Volume 1.chm**:网络编程是现代软件开发中的重要组成部分,这个文件可能讲解了C++如何进行网络通信,包括套接字编程、TCP/IP协议、多线程、异步I/O等,有助于开发者构建跨平台的网络...

    从C++导出类到Python

    在IT领域,跨语言编程是一种常见的需求,它允许我们利用不同语言的优点来构建复杂系统。本教程将聚焦于如何从C++中导出类到Python,这样你就可以在Python环境中利用C++的强大性能和效率。这通常通过Python的C API...

    C#调用C++代码完整实例

    不过,这种方式相对复杂,需要处理更多细节,包括内存管理、指针操作等。 总的来说,C#调用C++代码主要依赖于P/Invoke机制,通过DLLImport特性来声明C++的导出函数,并在C#中直接调用这些函数。这种跨语言交互方式...

    纯C++方式生成复杂格式的excel文件(linux下可运行)

    使用VC/C++生成excel的方式有很多,但是绝大部分要么是简单的csv文件,要么需要COM并已经安装ms excel,局限性比较大。 我这里提供一种使用C++编写以html脚本的方式生成xls文件的方法。不使用任何非C++标准库,支持...

    c++转C#工具

    C++是一种强大的、面向对象的编程语言,它的语法灵活但相对复杂,而C#则是微软开发的一种现代编程语言,它支持面向对象编程,同时引入了更多高级特性和垃圾回收机制,更适合于开发Windows平台的应用程序和服务。...

Global site tag (gtag.js) - Google Analytics