C/C++/内存管理
文章平均质量分 95
gauss
这个作者很懒,什么都没留下…
展开
-
C++的风格与技巧
C++的风格与技巧翻译:左轻侯(译注:本文的翻译相当艰苦。Bjarne Stroustrup不愧是创立C++语言的一代大师,不但思想博大精深,而且在遣词造句上,也非常精微深奥。有很多地方,译者反复斟酌,都不能取得理想的效果,只能尽力而为。Html格式的文档见译者主页:http://www.wushuang.net如果你对这个翻译稿有任何意见和建议,请发信给译者:onekey@163转载 2013-01-08 13:13:36 · 384 阅读 · 0 评论 -
c++中的explicit关键字
c++中的explicit关键字c++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢?如果c++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象,如下面所示: class MyClass{public:MyClass(转载 2013-01-08 13:12:02 · 250 阅读 · 0 评论 -
C++——STL所有算法介绍
STL算法部分主要由头文件,,组成。要使用 STL中的算法函数必须包含头文件,对于数值算法须包含,中则定义了一些模板类,用来声明函数对象。 STL中算法大致分为四类: 1、非可变序列算法:指不直接修改其所操作的容器内容的算法。 2、可变序列算法:指可以修改它们所操作的容器内容的算法。 3、排序算法:包括对序列进行排序和合并的算法、搜索转载 2013-01-08 13:06:03 · 367 阅读 · 0 评论 -
C++对象内存布局
C++对象内存布局1.1 最简单的类写一小段简单代码:class CTest{public: int var_a; int var_b; int var_c; public: void fun1() { var_a = 10; } void fun2()转载 2013-01-08 13:05:25 · 367 阅读 · 0 评论 -
有感于STL的内存管理
1. 背景前些天在一个技术分享会上,某大牛说,STL使用了内存池,释放内存的时候,并不释放给OS,而是自己由留着用。听到这些观点后,我就有些着急了,因为我以前一直是直接使用STL的一些工具类的,比如std::string、std::map、std::vector、std::list等等,从来都没有关注过内存的问题。带着内存的问题,我花了两三天的时间去阅读STL的代码,并且写转载 2013-01-08 13:03:40 · 342 阅读 · 0 评论 -
STL的内存分配器
题记:内存管理一直是C/C++程序的红灯区。关于内存管理的话题,大致有两类侧重点,一类是内存的正确使用,例如C++中new和delete应该成对出现,用RAII技巧管理内存资源,auto_ptr等方面,很多C/C++书籍中都使用技巧的介绍。另一类是内存管理的实现,如linux内核的slab分配器,STL中的allocator实现,以及一些特定于某种对象的内存管理等。最近阅读了一些内存管理实现方面的转载 2013-01-08 13:02:28 · 363 阅读 · 0 评论 -
shared_ptr源码解读
1 介绍众所周知,auto_ptr由于它的破坏性复制语义,无法满足标准容器对元素的要求,因而不能放在标准容器中;如果我们希望当容器析构时能自动把它容纳的指针元素所指的对象删除时,通常采用一些间接的方式来实现,显得比较繁琐。boost库中提供了一种新型的智能指针 shared_ptr,它解决了在多个指针间共享对象所有权的问题,同时也满足容器对元素的要求,因而可以安全地放入容器中。现在我们可以这转载 2013-01-08 12:53:51 · 426 阅读 · 0 评论 -
关于typedef的用法总结
不管实在C还是C++代码中,typedef这个词都不少见,当然出现频率较高的还是在C代码中。typedef与#define有些相似,但更多的是不同,特别是在一些复杂的用法上,就完全不同了,看了网上一些C/C++的学习者的博客,其中有一篇关于typedef的总结还是很不错,由于总结的很好,我就不加修改的引用过来了,以下是引用的内容(红色部分是我自己写的内容)。用途一:定义一种类型的别名,而不转载 2013-01-04 00:16:31 · 216 阅读 · 0 评论 -
从一道题谈C++中构造函数调用构造函数
题目如下:问下列代码的打印结果为0吗?#include stdlib.h>#include iostream>using namespace std;struct CLS{ int m_i; CLS( int i ) : m_i(i){} CLS() { CLS(0); }};int m转载 2013-01-04 00:16:12 · 251 阅读 · 0 评论 -
STL中string的源码解读
STL中string的源码解读 Ryan pengcutezero@163.comSunday, June 03, 2007 这是个人最近比较闲暇之余,对SGI STL中string分析,如果有任何理解错误,请和我联系,谢谢! 为什么要分析string呢?我们知道大多数的编译器实现的string都各不相同(即便是同一个编译厂商在不同的版本string的实现也不一样,转载 2013-01-08 13:15:43 · 834 阅读 · 0 评论 -
STL容器erase的使用陷阱(三)
原文:http://www.fengwanfeng.com/article.asp?id=42三、List容器中删除元素的方法对于list容器,由于list本身有remove和remove_if的成员函数,所以最好优先考虑list自己的算法,对于remove函数,比较简单,不再讨论,对于remove_if函数,本人发现在vc6.0中有重大问题。我试了多种函数对象,总是编译不过,通过查看转载 2013-01-08 13:16:30 · 388 阅读 · 0 评论 -
深入new
“new”是C++的一个关键字,同时也是操作符。关于new的话题非常多,因为它确实比较复杂,也非常神秘,下面我将把我了解到的与new有关的内容做一个总结。new的过程当我们使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。当然,如果我们创建的是简单类型的变量,那么第二步会被省略。假如我们定义了如下一个类A:class A{转载 2013-01-08 12:52:06 · 294 阅读 · 0 评论 -
原子操作 vs 非原子操作
在网上已经有很多有关介绍原子操作的内容,通常都是注重于原子读-修改-写(RMW)操作。然而,这些并不是原子操作的全部,还有同样重要的原子加载和原子存储。在这篇文章中,我将要在处理器级别和C/C++语言级别两个方面来对比原子加载和原子存储与它们相应的非原子部分。沿着这条路,我们将弄清楚C++11中“数据竞争”这个概念。共享内存中的原子操作是指它是否完成了一个线程相关的单步操作。当一个原子存储转载 2015-10-05 01:09:00 · 1145 阅读 · 0 评论 -
无锁数据结构(基础篇):原子核、原子性、基本类型
无锁数据结构基于两方面——原子性操作以及内存访问控制方法。本文中我话题主要涉及原子性和原子性基本类型。在开始之前,我对大家表示感谢,谢谢你们对初识无锁数据结构的热爱。看到大家对无锁话题很感兴趣,我感到很开心。我计划依据学术概念将此做成一个系列,从基础到算法,同时以 text 的形式展示 libcds 中的代码实现。但有些读者希望避开漫谈,尽快展示这些代码,以及如何利用这些库。我同意其中的一些观转载 2015-10-05 00:45:55 · 1631 阅读 · 0 评论 -
每个程序员都应该了解的 CPU 高速缓存(一)
现在的CPU比25年前要精密得多了。在那个年代,CPU的频率与内存总线的频率基本在同一层面上。内存的访问速度仅比寄存器慢那么一点点。但是,这一局面在上世纪90年代被打破了。CPU的频率大大提升,但内存总线的频率与内存芯片的性能却没有得到成比例的提升。并不是因为造不出更快的内存,只是因为太贵了。内存如果要达到目前CPU那样的速度,那么它的造价恐怕要贵上好几个数量级。如果有两个选项让你选择,一个是转载 2015-10-05 01:25:28 · 2456 阅读 · 0 评论 -
time_wait和close_wait
总结:一端忘记close,将造成另一端大量的close_wait的状态。主动执行close的一端,在量特别大的情况下,对so_linger没有做设置,将造成大量的time_wait状态的连接。TCP状态转移要点TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的转载 2015-04-16 13:48:10 · 372 阅读 · 0 评论 -
struct tm 和 time_t 时间和日期的使用方法(转)
关键字:UTC(世界标准时间),Calendar Time(日历时间),epoch(时间点),clock tick(时钟计时单元)1.概念在C/C++中,对字符串的操作有很多值得注意的问题,同样,C/C++对时间的操作也有许多值得大家注意的地方。下面主要介绍在C/C++中时间和日期的使用方法.通过学习许多C/C++库,你可以有很多操作、使用时间的方法。但在这之前你需要了解一转载 2013-01-04 22:29:08 · 401 阅读 · 0 评论 -
C++中不常用的关键字
mutable关键字 关键字mutable是C++中一个不常用的关键字,他只能用于类的非静态和非常量数据成员我们知道一个对象的状态由该对象的非静态数据成员决定,所以随着数据成员的改变,对像的状态也会随之发生变化!如果一个类的成员函数被声明为const类型,表示该函数不会改变对象的状态,也就是该函数不会修改类的非静态数据成员.但是有些时候需要在该类函数中对类的数据成员进行赋值.这个时候转载 2013-02-05 22:28:34 · 298 阅读 · 0 评论 -
彻底学习STL中的Allocator
Allocator是C++语言标准库中最神秘的部分之一。它们很少被显式使用,标准也没有明确出它们应该在什么时候被使用。今天的allocator与最初的STL建议非常不同,在此过程中还存在着另外两个设计--这两个都依赖于语言的一些特性,而直到最近才在很少的几个编译器上可用。对allocator的功能,标准似乎在一些方面追加了承诺,而在另外一些方面撤销了承诺。 这篇专栏文章将讨论你能用all转载 2013-01-08 13:11:15 · 766 阅读 · 0 评论 -
STL的不同实现版本
HP STLHP STL是所有其它STL实现版本的根源。它是STL之父Alexander Stepanov在惠普的Palo Alto实验室工作时,和Meng Lee共同完成的,是第一个STL的实现版本(参见1.2节)。这个STL是开放源码的,所以它允许任何人免费使用、复制、修改、发布和销售该软件和相关文档,前提是必须在所有相关文件中加入HP STL的版本信息和授权信息。现在已经很少直接使用这个转载 2013-01-08 13:08:30 · 506 阅读 · 0 评论 -
auto_ptr与shared_ptr --- auto_ptr
Roger (roger2yi@gmail.com) 这篇文章试图说明如何使用auto_ptr和shared_ptr,从而使得动态分配对象的使用和管理更安全,方便。除了一般的使用说明外,更主要是说明它们之间的异同 —— 满足需求的不同和开销上的差异。 文章的多数知识都来源于: 1. Exceptional C++(Herb)Item 37 auto_ptr2. Exce转载 2013-01-08 12:56:00 · 404 阅读 · 0 评论 -
C++内存分配秘籍—new,malloc,GlobalAlloc详解
C++内存分配秘籍—new,malloc,GlobalAlloc详解 _______只为因内存分配而无法入眠的程序员一。关于内存 1、内存分配方式 内存分配方式有三种: (1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全转载 2013-01-04 00:12:18 · 281 阅读 · 0 评论 -
va_start va_arg va_end 的原理与实例
转自:http://blog.csdn.net/sunboy_2050/article/details/6189072func( Type para1, Type para2, Type para3, ... ) { /****** Step 1 ******/ va_list ap; va_start( ap, para3 ); /转载 2013-01-04 22:18:54 · 296 阅读 · 0 评论 -
标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast
一、 强制转型1) C 风格(C-style)强制转型: (T) exdivssion // cast exdivssion to be of type T2) 函数风格(Function-style)强制转型使用这样的语法: T(exdivssion) // cast exdivssion to be of type T上面两种形式之间没有本质上的不同,它纯粹就是转载 2013-01-04 22:21:47 · 260 阅读 · 0 评论 -
让我们习惯在底层用C++宏生成代码
春天最难堪的是没有收成的垦植;人生最难堪的是失踪往决意信念的寂寞 我们知道操作C++泛型编程可以写出扩年夜性很是强的法式,操作C++的接***术也可以很等闲的扩年夜出已经存在的法式。只不外有一件工作它们可都做不到,那就是操作宏来产生代码。操作宏来生成代码凡是对于库作者和底层架构者具有不凡的意义,而在操作层小我认为该当尽量削减它的操作,当然,这并不影响我们往进修并认识它。思惟好比火星:一颗火转载 2013-01-03 18:34:45 · 574 阅读 · 0 评论 -
纯虚函数的使用汇总
http://hi.baidu.com/%C3%E2%B7%D1%B4%F3%BB%B0%D0%F2%C1%D0%BA%C5/blog/item/e8c7c10fc021a1e7aa645729.ht 一、抽象类含有纯虚函数的类被称为抽象类。抽象类是一种特殊的类,它是为了抽象和设计的目的而建立的,它处于继承结构的上层。抽象类是不能定义对象的,在实际中为了强调一个类是抽象类,可将该类转载 2013-01-04 00:17:57 · 470 阅读 · 0 评论 -
typedef和typename关键字
1、类型说明typedef类型说明的格式为: typedef 类型 定义名; 类型说明只定义了一个数据类型的新名字而不是定义一种新的数据类型。定义名表示这个类型的新名字。 例如: 用下面语句定义整型数的新名字: typedef int SIGNED_INT; 使用说明后, SIGNED_INT就成为int的同义词了, 此时可以用SIGNED_INT 定义整型变量。例如转载 2013-01-04 00:17:01 · 277 阅读 · 0 评论 -
C++中你不知道的语法
传构造函数,不会引起拷贝构造函数的调用当传一个一个已经构造好的对象时,[cpp] view plaincopy#include #include #include #include using namespace std; class Foo { public:转载 2013-01-04 00:13:44 · 373 阅读 · 0 评论 -
关于C++中算符重载的高级话题 - 从OO暴露接口的角度审视
算符重载的作用是什么?它允许你为类的用户提供一个直觉的接口。 算符重载允许C/C++的运算符在用户定义类型(类)上拥有一个用户定义的意义。重载的算符是函数调用的语法修饰: class Fred { public: // … }; #if 0 // 没有算符重载: Fred add(Fred, Fred); Fred mul(Fred,转载 2011-12-26 23:51:18 · 318 阅读 · 0 评论 -
c++内存分配优先使用内存池,而不是new,delete
认识一下new和delete的开销:new和delete首先会转调用到malloc和free,这个大家应该很熟识了。很多人认为malloc是一个很简单的操作,其实巨复杂,它会执行一个系统调用(当然不是每一次,windows上是按页算),该系统调用会锁住内存硬件,然后通过链表的方式查找空闲内存,如果找到大小合适的,就把用户的进程地址映射到内存硬件地址中,然后释放锁,返回给进程。如果在多线程环转载 2011-12-26 22:36:02 · 497 阅读 · 0 评论 -
内存池
如 前所述,读者已经了解到"堆"和"栈"的区别。而在编程实践中,不可避免地要大量用到堆上的内存。例如在程序中维护一个链表的数据结构时,每次新增或者删 除一个链表的节点,都需要从内存堆上分配或者释放一定的内存;在维护一个动态数组时,如果动态数组的大小不能满足程序需要时,也要在内存堆上分配新的内存 空间。6.1.1 默认内存管理函数的不足利用默认的内存管理函数new/delete或malloc转载 2011-12-26 22:32:31 · 451 阅读 · 0 评论 -
一些好的书籍
基础级别的> 入门书籍太经典了,看了三四遍还回味无穷,第三版最经典.作为c++基础书籍推荐看一下.> 还不错,作为入门了解STL库一些常用的容器与数据结构用法.看了这本书以后对使用STL应该没问题了.> 对STL使用讲解比较详细.进阶j级别的 >对模板技术使用讲解比较详细,其实在<<C++ Primer>>也简单讲解模板技术,但没有这么透彻.如果你想对模板与泛型技术原创 2011-12-06 00:52:07 · 480 阅读 · 0 评论 -
c++函数调用约定与函数名称修饰规则
函数调用约定(calling convention)函数调用约定不仅决定了发生函数调用时函数参数的入站顺序,还决定了是由调用者函数还是被调用者函数负责清除栈中的参数,还原堆栈.函数调用约定有很多方式,除了常见的_cdel, _stdcall和_fastcall之外,c++的编译器还支持thiscall方式,不少c/c++编译器还支持naked call方式,下面我们来说说各种修饰方式原创 2011-12-18 08:58:34 · 755 阅读 · 0 评论 -
深入new
“new”是C++的一个关键字,同时也是操作符。关于new的话题非常多,因为它确实比较复杂,也非常神秘,下面我将把我了解到的与new有关的内容做一个总结。new的过程当我们使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。当然,如果我们创建的是简单类型的变量,那么第二步会被省略。假如我们定义了如下一个类A:class A{转载 2013-01-04 00:02:03 · 266 阅读 · 0 评论 -
auto_ptr与shared_ptr --- auto_ptr
Roger (roger2yi@gmail.com) 这篇文章试图说明如何使用auto_ptr和shared_ptr,从而使得动态分配对象的使用和管理更安全,方便。除了一般的使用说明外,更主要是说明它们之间的异同 —— 满足需求的不同和开销上的差异。 文章的多数知识都来源于: 1. Exceptional C++(Herb)Item 37 auto_ptr2. Exce转载 2013-01-04 00:04:36 · 396 阅读 · 0 评论 -
浅议 Dynamic_cast 和 RTTI
写这篇博文的目的是,记录学习过程。 对于问题要较真,在解决这个问题中会学到很多,远远超过自己期望,锻炼思维,享受这个过程。 问题: Static_cast 与 Dynamic_cast的区别 来自书本上的解释: 用 static_cast ( expression ) 1. static_cast(expression) The static_cast'e.g.'转载 2013-01-04 00:14:07 · 1225 阅读 · 0 评论 -
C++中extern “C”含义深层探索
1.引言 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言,C++保留了一部分过程式语言的特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显转载 2013-01-04 22:19:59 · 276 阅读 · 0 评论 -
C++ 智能指针
智能指针(Smart Pointer),是一个来用存储指向动态分配(堆)对象指针的类。简单的说,它本身是一个类,这个类是用来存储对象指针。一、智能指针的介绍智能指针,就是具备指针功能同时提供安全内存回收的一个类。它是用一个对象来对指针进行建模,使之具有指针的特性,跟指针具有相同含义的 -> 和 * 操作.并且通过对象的构造函数(获取资源),析构资源(释放资源)来对资源进行管转载 2013-01-04 22:17:30 · 318 阅读 · 0 评论 -
C++ 的效率浅析
自从七十年代C语言诞生以来,一直以其灵活性、高效率和可移植性为软件开发人员所钟爱,成为系统软件开发的首选工具。而 C++ 作为 C 语言的继承和发展,不仅保留了C 语言的高度灵活、高效率和易于理解等诸多优点,还包含了几乎所有面向对象的特征,成为新一代软件系统构建的利器。 相对来说,C 语言是一种简洁的语言,所涉及的概念和元素比较少,主要是:宏(macro)、指针(poi转载 2013-01-04 00:15:30 · 401 阅读 · 0 评论 -
shared_ptr用法
头文件: "boost/shared_ptr.hpp"几乎所有稍微复杂点的程序都需要某种形式的引用计数智能指针。这些智能指针让我们不再需要为了控制被两个或多个对象共享的对象的生存期而编写复杂的逻辑。当引用计费降为零,没有对象再需要这个共享的对象,这个对象就自动被销毁了。引用计数智能指针可以分为插入式(intrusive)和非插入式(non-intrusive)两类。前者要求它所管理的类提供明确转载 2013-01-04 00:03:37 · 417 阅读 · 0 评论