代码改变世界

随笔分类 -  C/C++ Internals

C++静态库与动态库

2013-10-16 20:18 by 吴秦, 192444 阅读, 收藏, 编辑
摘要: C++静态库与动态库 这次分享的宗旨是——让大家学会创建与使用静态库、动态库,知道静态库与动态库的区别,知道使用的时候如何选择。这里不深入介绍静态库、动态库的底层格式,内存布局等,有兴趣的同学,推荐一本书《程序员的自我修养——链接、装载与库》。 什么是库 库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非... 阅读全文

C++对象模型

2013-09-27 22:48 by 吴秦, 38142 阅读, 收藏, 编辑
摘要: C++对象模型 何为C++对象模型? C++对象模型可以概括为以下2部分: 1. 语言中直接支持面向对象程序设计的部分 2. 对于各种支持的底层实现机制 语言中直接支持面向对象程序设计的部分,如构造函数、析构函数、虚函数、继承(单继承、多继承、虚继承)、多态等等,这也是组里其他同学之前分享过的内容。第一部分这里我简单过一下,重点在底层实现机制。 在c语言中,“数据”和“处理数据的操作(函数)”是分开来声明的,也就是说,语言本身并没有支持“数据和函数”之间的关联性。在c++中,通过抽象数据类型(abstract data type,ADT),在类中定义数据和函数,来实现数... 阅读全文

C/C++ Memory Layout

2011-03-07 18:29 by 吴秦, 12909 阅读, 收藏, 编辑
摘要: 为什么需要知道C/C++的内存布局和在哪可以可以找到想要的数据?知道内存布局对调试程序非常有帮助,可以知道程序执行时,到底做了什么,有助于写出干净的代码。本文的主要内容如下: 源文件转换为可执行文件 可执行程序组成及内存布局 数据存储类别 一个实例 总结 源文件转换为可执行文件 源文件经过以下几步生成可执行文件: 1、预处理(preprocessor):对#include、#define、#ifd... 阅读全文

C/C++内存泄漏及检测

2011-02-20 17:51 by 吴秦, 175861 阅读, 收藏, 编辑
摘要: “该死系统存在内存泄漏问题”,项目中由于各方面因素,总是有人抱怨存在内存泄漏,系统长时间运行之后,可用内存越来越少,甚至导致了某些服务失败。内存泄漏是最难发现的常见错误之一,因为除非用完内存或调用malloc失败,否则都不会导致任何问题。实际上,使用C/C++这类没有垃圾回收机制的语言时,你很多时间都花在处理如何正确释放内存上。如果程序运行时间足够长,如后台进程运行在服务器上,只要服务器不宕机就一直运行,一个小小的失误也会对程序造成重大的影响,如造成某些关键服务失败。对于内存泄漏,本人深有体会!实习的时候,公司一个项目中就存在内存泄漏问题,项目的代码两非常大,后台进程也比较多,造成内存泄漏的地 阅读全文

Linux Socket编程(不限Linux)

2010-12-12 21:58 by 吴秦, 374805 阅读, 收藏, 编辑
摘要: “一切皆Socket!”话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket。——有感于实际编程和开源项目研究。我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的。本文的主要内容如下:1、网络中进程之间如何通信?2、Socket是什么?3、socke 阅读全文

(unix domain socket)使用udp发送>=128K的消息会报ENOBUFS的错误

2010-12-04 15:49 by 吴秦, 24083 阅读, 收藏, 编辑
摘要: 一个困扰我两天的问题,Google和Baidu没有找到解决方法!此文为记录这个问题,并给出原因和解决方法。1、Unix domain socket简介unix域协议并不是一个实际的协议族,而是在单个主机上执行客户/服务器通信的一种方法,所用API于在不同主机上执行客户/服务器通信所有的API(套接字API,如AF_INET、AF_INET6等类型的API)相同。unix域协议可以视为是进程之间本地... 阅读全文

【日常小记】内存分配方式及常见错误

2010-12-03 00:07 by 吴秦, 6171 阅读, 收藏, 编辑
摘要: 积少成多,滴水穿石——自勉 内存操作对于程序开发人员来说,永远是一块雷区。在这片区域,总是不断的埋雷、排雷,而且往往是排雷花了非常大的代价。记得在公司实习时,有大概2个星期的时间,team的几个人去排雷——有地方发生了memory leak! 而以我现在的认知来看,只有极少数的programer敢拍着胸脯说,非常熟悉内存操作,手到擒来不会排雷。针对这个情况,我要求自己在尽量去探索,以求少埋雷、... 阅读全文

Linux多线程编程(不限Linux)

2010-10-30 20:58 by 吴秦, 100026 阅读, 收藏, 编辑
摘要: ——本文一个例子展开,介绍Linux下面线程的操作、多线程的同步和互斥。前言线程?为什么有了进程还需要线程呢,他们有什么区别?使用线程有什么优势呢?还有多线程编程的一些细节问题,如线程之间怎样同步、互斥,这些东西将在本文中介绍。我在某QQ群里见到这样一道面试题:是否熟悉POSIX多线程编程技术?如熟悉,编写程序完成如下功能:1)有一int型全局变量g_Flag初始值为0;2) 在主线称中起动线程1,打印“this is thread1”,并将g_Flag设置为13) 在主线称中启动线程2,打印“this is thread2”,并将g_Flag设置为24) 线程序1需要在线程2退出后才能退出5 阅读全文

C++中的4种显示类型转换(草稿)

2010-09-30 23:14 by 吴秦, 5480 阅读, 收藏, 编辑
摘要: 类型转换在。我们编写程序时是不可避免的,比如我们分配一个内存区域,它将要存储的对象类型对编译器是不可知的。最典型的例子就是void*指针,调用malloc时会返回一个void*,编译器并不知道void*指向的对象类型。 由此可见,类型转换时不可以或缺的!下面我们介绍C++提供的4种显示类型转换,及继承自C的类型转换方式(Type)expression。本文的主要内容如下: 写在前面 static... 阅读全文

C中的继承和多态

2010-09-23 00:27 by 吴秦, 27154 阅读, 收藏, 编辑
摘要: 1、引言 继承和多态是面向对象语言最强大的功能。有了继承和多态,我们可以完成代码重用。在C中有许多技巧可以实现多态。本文的目的就是演示一种简单和容易的技术,在C中应用继承和多态。通过创建一个VTable(virtual table)和在基类和派生类对象之间提供正确的访问,我们能在C中实现继承和多态。VTable能通过维护一张函数表指针表来实现。为了提供基类和派生类对象之间的访问,我们可以在基类中... 阅读全文

C++中的指针与引用

2010-09-22 02:32 by 吴秦, 56446 阅读, 收藏, 编辑
摘要: 写在前面指针和引用形式上很好区别,但是他们似乎有相同的功能,都能够直接引用对象,对其进行直接的操作。但是什么时候使用指针?什么时候使用引用呢?这两者很容易混淆,在此我详细介绍一下指针和引用,力争将最真实的一面展现给大家。如果我喷得不够好,希望嘴下留情、手下留命,还请指点一二;如果感觉还不错,请大家鼓掌。1、指针和引用的定义在深入介绍之前我们首先来看一下指针和引用的定义、指针和引用的区别,然后分别针... 阅读全文

C++的函数重载

2010-09-05 21:26 by 吴秦, 156898 阅读, 收藏, 编辑
摘要: ——每个现象后面都隐藏一个本质,关键在于我们是否去挖掘写在前面:函数重载的重要性不言而明,但是你知道C++中函数重载是如何实现的呢(虽然本文谈的是C++中函数重载的实现,但我想其它语言也是类似的)?这个可以分解为下面两个问题1、声明/定义重载函数时,是如何解决命名冲突的?(抛开函数重载不谈,using就是一种解决命名冲突的方法,解决命名冲突还有很多其它的方法,这里就不论述了... 阅读全文

一道简单的题目引发的思考

2010-07-11 05:42 by 吴秦, 9217 阅读, 收藏, 编辑
摘要: ——Don't believe in magic !Understand what your program do ,how they do .引言昨晚一时兴起,我脑子就问自己下面的代码会输出什么,也不知道我脑子为什么有这个代码模型,只是模糊的有些印象:您会怎样考虑这个问题呢?您不运行这个程序能准确地说出答案吗?我猜想肯定有大部分人不能肯定且准确地说出答案!如果您不能,这篇... 阅读全文

C++项目中的extern "C" {}

2010-07-10 19:45 by 吴秦, 178184 阅读, 收藏, 编辑
摘要: 引言在用C++的项目源码中,经常会不可避免的会看到下面的代码:#ifdef __cplusplusextern "C" {#endif/*...*/#ifdef __cplusplus}#endif它到底有什么用呢,你知道吗?而且这样的问题经常会出现在面试or笔试中。下面我就从以下几个方面来介绍它:1、#ifdef _cplusplus/#endif _cplusplus及发散2、extern "C"2.1、extern关键字2.2、"C"2.3、小结extern "C"3、C和C++互相调用3.1、C++的编译和 阅读全文

STL之Map

2010-06-18 19:49 by 吴秦, 32681 阅读, 收藏, 编辑
摘要: 概述Map是标准关联式容器(associative container)之一,一个map是一个键值对序列,即(key ,value)对。它提供基于key的快速检索能力,在一个map中key值是唯一的。map提供双向迭代器,即有从前往后的(iterator),也有从后往前的(reverse_iterator)。map要求能对key进行<操作,且保持按key值递增有序,因此map上的迭代器也是递... 阅读全文