
C++
文章平均质量分 81
鱼思故渊
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++新特性 右值引用 移动构造函数
1、右值引用引入的背景临时对象的产生和拷贝所带来的效率折损,一直是C++所为人诟病的问题。但是C++标准允许编译器对于临时对象的产生具有完全的自由度,从而发展出了Copy Elision、RVO(包括NRVO)等编译器优化技术,它们可以防止某些情况下临时对象产生和拷贝。下面简单地介绍一下Copy Elision、RVO,对此不感兴趣的可以直接跳过:(1) Copy Elision Co原创 2014-08-16 20:49:25 · 2845 阅读 · 0 评论 -
C++在单继承、多继承、虚继承时,复制构造函数。赋值构造函数、析构函数的执行顺序
一、本文目的与说明 1. 本文目的:理清在各种继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容。 2. 说明:虽然复制构造函数属于构造函数的一种,有共同的地方,但是也具有一定的特殊性,所以在总结它的性质时将它单独列出来了。 3. 单继承、多继承、虚继承,既然都属于继承,那么虽然有一定的区别,但还是相同点比较多。如果放在一块讲,但为了将内容制作成转载 2014-08-16 22:12:10 · 1501 阅读 · 0 评论 -
STL源码学习--vector使用方法总结
一、容器vector使用vector必须包含头文件:#include型别vector是一个定义于namespace std内的template:[cpp] view plaincopyprint?templateclass _Ty, class _Ax = allocator > 第二个参数定义内存模型。我们一般采用默认的内存模型。原创 2014-08-31 09:50:48 · 1198 阅读 · 0 评论 -
使用C++实现一个LRU cache
什么是LRU CacheLRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法。什么是Cache?狭义的Cache指的是位于CPU和主存间的快速RAM,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。广义上的Cache指的是位于速度相差较大的两种硬件之间,用于协调两者数据传输速度差异的结构。除了CPU与主存之间有Cache原创 2014-09-28 12:04:38 · 5428 阅读 · 0 评论 -
C++类特殊成员变量(引用、静态、常成员变量)的初始化操作
有些成员变量的数据类型比较特别,它们的初始化方式也和普通数据类型的成员变量有所不同。这些特殊的类型的成员变量包括:a.引用b.常量c.静态d.静态常量(整型)e.静态常量(非整型) 常量和引用,必须通过参数列表进行初始化。 静态成员变量的初始化也颇有点特别,是在类外初始化且不能再带有static关键字,其本质见文末。参考下面的代码以及其中注释:原创 2014-11-09 16:41:55 · 1799 阅读 · 0 评论 -
static关键字在C和C++中的使用方法
一、C语言的static关键字的两种使用方法1)、用于函数内部修饰变量,即函数内的静态变量。这种变量的生存期长于该函数,是的函数具有一定的“状态”,使用静态变量的函数一般是不可重入的,也不是线程安全的,比如strtok()2)用在文件级别(函数体外),修饰变量或函数,变量该变量或函数只能在文本可见,其他文件看不到,也访问不到该变量或函数。二、C++语言的static关键字的四种用法原创 2014-11-09 15:23:41 · 1399 阅读 · 0 评论 -
为什么多线程读写 shared_ptr 要加锁?
为什么多线程读写 shared_ptr 要加锁? (shared_ptr)的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成员,读写操作不能原子化。根据文档(http://www.boost.org/doc/libs/release/libs/smart_ptr/shared_ptr.htm#ThreadSafety), shared_ptr转载 2014-10-30 21:57:39 · 1339 阅读 · 0 评论 -
shared_ptr线程安全性分析
shared_ptr线程安全性分析正如《STL源码剖析》所讲,“源码之前,了无秘密”。本文基于shared_ptr的源代码,提取了shared_ptr的类图和对象图,然后分析了shared_ptr如何保证文档所宣称的线程安全性。本文的分析基于boost 1.52版本,编译器是VC 2010。shared_ptr的线程安全性boost官方文档对shared_ptr线程安全性的正式表述是:转载 2014-11-05 22:00:23 · 1297 阅读 · 0 评论 -
const修饰函数参数 const修饰函数返回值 const修饰成员函数
看到const 关键字,C++程序员首先想到的可能是const 常量。这可不是良好的条件反射。如果只知道用const 定义常量,那么相当于把火药仅用于制作鞭炮。const 更大的魅力是它可以修饰函数的参数、返回值,甚至函数的定义体。const 是constant 的缩写,“恒定不变”的意思。被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。所以很多C++程序设原创 2014-11-27 21:03:28 · 1941 阅读 · 0 评论 -
const常量引用的使用方法
C++编程语言中,对于常量的引用是一个非常重要的应用技巧。在这篇文章中,我们将会为大家详细介绍一下有关C++常量引用的相关应用方法,相信大家可以从中学到很多知识。C++单例模式基础内容详解C++创建Web服务相关方法剖析C++构造函数如何进行初始化C++标识符命名规则相关应用技巧分享C++函数模板基本概念讲述如果是对一个常量进行引用,则编译器首先建立一个临时变量,然后将该常量的原创 2014-11-27 21:07:07 · 4731 阅读 · 0 评论 -
智能指针share_ptr使用过程中需要注意的几点
智能指针在boost中很早就有了,在tr1上也很早,但是没怎么用,后来0x标准出来之后,智能指针变成了标准库,所以现在用起来就不区分boost和std了。主要说下share_ptr的几个注意点,待补全。1.环状的链式结构可能会形成内存泄露例如:class BaseClass;class ChildClass;typedef std::shared_ptr BaseClassP转载 2014-11-05 21:19:37 · 7022 阅读 · 0 评论 -
关于c++ const的全面总结
C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助。Const 是C++中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。 一、Const作用 如下表所示:No.作用说明参考代码原创 2014-11-27 21:36:04 · 888 阅读 · 0 评论 -
C++ 经验条款
C++经验谈:一、绝不让构造函数称为虚函数: 从最简单的思想来看,C++对象模型中是根据虚函数表来管理虚函数的,那么在调用虚函数时,需要找到虚函数表,在对象没有创建成功时是没有虚函数表指针的,构造函数就是构造对象的,在对象没有创建成功之前来寻找虚函数表是不合理的。 一般情况下,编译器会为每个类生成一个公有的默认构造函数,但是有两种特殊情况例外:原创 2014-11-30 10:32:40 · 1177 阅读 · 0 评论 -
boost库中bind()和function()的使用方法
Boost::Function 是对函数指针的对象化封装,在概念上与广义上的回调函数类似。相对于函数指针,function除了使用自由函数,还可以使用函数对象,甚至是类的成员函数,这个就很强大了哈。1. 一个简单的示例代码?123456789101112131415161718192转载 2014-11-06 23:05:53 · 1864 阅读 · 0 评论 -
C++中算术运算的隐式转换规则
1、隐式转换 C在以下四种情况下会进行隐式转换: 1、算术运算式中,低类型能够转换为高类型。 2、赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型,并赋值给他。 3、函数调用中参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参。 4、函数有返回值时,系统将隐式地将返回表达式类型转换为返回值类型,赋值给调用函数。原创 2014-12-01 10:12:53 · 6049 阅读 · 0 评论 -
深入探索C++对象模型--对象模型
C++对象模型C++中数据成员有两种:static和nonstatic,以及三种classmember functions:static nonstatic和virtual现在标准C++对象模型:Nonstatic data Members被置于每一个classobject之内,static data members则被存放在所有的class object之外,static和nonst原创 2014-12-16 12:41:32 · 1025 阅读 · 0 评论 -
Linux内核结构体--kfifo 环状缓冲区
1、前言 最近项目中用到一个环形缓冲区(ring buffer),代码是由linux内核的kfifo改过来的。缓冲区在文件系统中经常用到,通过缓冲区缓解cpu读写内存和读写磁盘的速度。例如一个进程A产生数据发给另外一个进程B,进程B需要对进程A传的数据进行处理并写入文件,如果B没有处理完,则A要延迟发送。为了保证进程A减少等待时间,可以在A和B之间采用一个缓冲区,A每次将数据存放在缓冲区中,原创 2014-12-17 19:46:37 · 8629 阅读 · 5 评论 -
深入探索C++对象模型--C++构造函数
C++构造函数语意对象构造过程中编译器的干预原则和方法。Default constructor的构建方法经常会提到default constructor,那么什么时候才会合成出一个default consgtructor呢?当编译器需要它的时候。别合成出来的constructor值执行编译器所需的行动。 如果一个class没有任何constructor,但它内含一个原创 2014-12-16 19:57:45 · 845 阅读 · 0 评论 -
C++基础知识--赋值操作符重载
赋值运算符重载:赋值运算符重载需要考虑什么问题:Class mystring{ Public: Mystring(char*pdata = NULL); Mystring(constmystring& str); ~mystring(void);原创 2014-12-19 19:26:24 · 858 阅读 · 0 评论 -
C++基础知识---构造函数 & 析构函数 & 虚拟析构函数
问题: 类需要一个无参的构造函数么? 类需要一个析构函数么? 类的构造函数需要初始化所有的对象成员么? 类需要一个虚析构函数么?有些类需要虚析构函数只是为了声明他们的析构函数是虚的。绝不会用作基类的类是不需要虚析构函数的:任何虚函数只在继承的情况下才有用。假设B为父类,D为子类,B何时需要一个虚析构函数?只有有人肯呢过会对实际指原创 2014-12-19 19:22:51 · 997 阅读 · 0 评论 -
C++基础知识—关于默认构造函数的一切
C++条款—关于默认构造函数的一切 默认构造函数(defaultconstructor):默认构造函数是在未提供显示初始值时,用来创建对象的构造函数。如果没有提供任何构造函数,则C++将自动提供默认构造函数,默认构造函数没有参数,因为声明中不包含值。同时,当且仅当没有定义构造函数时,编译器才会提供默认构造函数。为类定义了构造函数后,程序员就必须为它提供默认构造函数,如果提供了非默认构造原创 2014-12-19 19:24:30 · 1991 阅读 · 0 评论 -
STL源码分析--算法
STL源码剖析—算法 在STL中的算法中一些算法是可以根据算法名字来判断算法作用的。所有算法的参数都是迭代器,不过不同的算法调用的迭代器类型也是不同的。多有的STL算法都作用在由迭代器{first,lase)所表示出来的区间上。拷贝(copy)交换(swap)替换(replace)填写(fill)删除(remove)排列组合(permutation)分割(partition)随原创 2014-12-13 18:44:28 · 918 阅读 · 0 评论 -
Effective STL 建议
Vector是一种可以默认使用的序列类型,当很频繁地对序列中部进行插入和删除时应该用lit,当大部分插入和删除发生在序列的头或尾时可以选择deque这种数据结构。 STL是建立在泛化上的。数组泛化了容器,参数化了所包含的对象的类型。函数泛化为算法,参数化了所有的迭代器的类型。指针泛化为迭代器,参数化了所指向的对象的类型。 独立的容器类型泛化为序列或关联容器,原创 2014-12-06 08:55:21 · 1869 阅读 · 0 评论 -
泛型编程与STL--各类容器迭代器失效的场景
各类容器迭代器失效的场景:其实在定义迭代器失效的时:在某些操作完成以后,认为这个迭代器指向的值有变化或者迭代器直接指向不合法的空间,都认为迭代器失效。只要不是指向操作之前的值都认为迭代器失效。当要将元素安插于vector内,大小与容量之间的差别就变得格外重要。如果vector的大小等于其容量,安插新元素的唯一方法就是增加这个vector的内存总量,这意味得分配一块新的而且更大的内存,再将旧原创 2014-12-22 14:52:46 · 1470 阅读 · 0 评论 -
Effective STL--交换技巧来修改过剩容量
通过“交换技巧”来修正过剩容量 假设一个向量在使用的过程中被扩大了容量,但是在以后的过程中向量中的元素又被删除,虽说向量中的元素被删除但是向量的容量没有变小,也就是说原来申请的内存空间没有得到释放,加入在某一个时刻向量的容量为10000,最后向量中的元素个数可能是10,那么过剩的空间就是浪费,这个时候可以通过交换算法来修改向量的大小。#include #include原创 2014-12-06 19:47:58 · 1145 阅读 · 0 评论 -
高效STL—迭代器 & 算法
高效STL—迭代器 & 算法 每个标准STL容器提供了四种不容的迭代器:iterator、const_iterator、reverse_iterator和const_reverse_iterator。同时容器的insert和erase的某些形式只接受其中一种。没有办法从const的迭代器转换为非const的迭代器,不能隐式转换也不能通过const_case转换。但是可以使用原创 2014-12-06 21:11:56 · 1142 阅读 · 0 评论 -
STL源码剖析 --- 空间配置器 std::alloc
STL是建立在泛化之上的。数组泛化为容器,参数化了所包含的对象的类型。函数泛化为算法,参数化了所用的迭代器的类型。指针泛化为迭代器,参数化了所指向的对象的类型。STL中的六大组件:容器、算法、迭代器、配置器、适配器、仿函数。这六大组件中在容器中分为序列式容器和关联容器两类,正好作为STL源码剖析这本书的内容。迭代器是容器和算法之间的胶合剂,从实现的角度来看,迭代器是一种将operator*、o原创 2014-12-07 23:24:38 · 2576 阅读 · 0 评论 -
Effective STL --关联容器
高效STL—关联容器 标准关联容器中最重要的就是基于等价而不是相等。比如对于基本的函数库有find函数,但是对于set关联容器也是有find成员函数的。因为标准关联容器保持有序,所以每一个容器必须有一个定义了怎么保持东西有序的比较函数(默认是less)。等价是根据这个比较函数定义的,所以标准关联容器的用户只需要为他们要使用的任意容器指定一个比较函数原创 2014-12-06 19:44:21 · 963 阅读 · 0 评论 -
STL源码剖析—序列容器
STL源码剖析—序列容器对于STL中的容器,存在一定的内含关系,例如,heap内含一个vector,priority-queue内含一个hep,stack和queue都含有一个deque,set/map/multiset/multimap都内含一个RB-tree,hash_x都内含一个hashtable。 对于序列容器来说,vector和list的插入都是在指向迭代器之前进原创 2014-12-08 22:31:57 · 1303 阅读 · 0 评论 -
C++基础知识---static const成员变量的初始化
为了将常量的作用域限制于class内,你必须让让成为class的一个成员;而为确保此常量之多只有一份实体,你必须让让成为一个static成员:Class Gameplayer{ Private: Staticconst int Number = 5; //常量声明式 Intscores[N原创 2014-12-23 22:41:41 · 1843 阅读 · 0 评论 -
Effective c++--智能指针 & 函数模板
Shared_ptr允许当智能指针被建立起来是指定一个资源释放函数绑定于智能指针身上,也就是说在shared_ptr被初始化的同时也可以指定其管理的资源的释放函数。Shared_ptr提供的某个构造函数接受两个实参:一个是被管理的指针,另一个是引用次数变为0时将被调用的“删除器”。Shared_ptr构造函数坚持其第一个参数必须是个指针。它支持定制型删除器。 缺省情况下C++以by val原创 2014-12-24 21:22:49 · 1155 阅读 · 0 评论 -
C++中的bind function lambda
本文是C++0x系列的第四篇,主要是内容是C++0x中新增的lambda表达式, function对象和bind机制。之所以把这三块放在一起讲,是因为这三块之间有着非常密切的关系,通过对比学习,加深对这部分内容的理解。在开始之间,首先要讲一个概念,closure(闭包),这个概念是理解lambda的基础。下面我们来看看wikipedia上对于计算机领域的closure的定义:原创 2014-11-06 23:16:56 · 771 阅读 · 0 评论 -
STL源码剖析---关联容器
STL源码剖析---关联容器 标准关联容器分为set和map两大类,包括multiset和multimap,这些容器的底层机制都是RB-tree.标准之外的关联容器有hashtable 以及以此hash table为底层机制而完成的hash_set(散列集合) hash_map(散列映射表) hash_multiset hash_multimap.序列和关联容器各自的内部原创 2014-12-09 22:02:01 · 1055 阅读 · 0 评论 -
STL源码剖析—迭代器与traits编程方法
STL源码剖析—迭代器与traits编程方法 STL的中心思想就是将算法和容器分开,彼此独立设计,最后再以粘合在一起,算法和容器的泛型化,并不是很难,C++的class templates和function templates可以达成目标,但是粘合在一起就是迭代器的事情。 这么一说迭代器就是为了粘合算法和容器的,如果单独设计迭代器,那么这个迭代器就必须知道某原创 2014-12-08 19:53:39 · 1132 阅读 · 0 评论 -
Effective STL--不同容器删除特定元素的方法
输入迭代器是每个迭代位置智能被读一次的只读迭代器。输出迭代器是每个迭代位置只能被写一次的只写迭代器。输入和输出迭代器被塑造为读和写输入和输出流。前向迭代器有输入和输出迭代器的能力,但是他们可以反复读或写一个位置。它们不支持operator--,所以他们可以高效地向前移动任意次数。所有的标准STL容器都支持比前向迭代器更强大的迭代器。散列容器是前向迭代器,单链表容器也提供前向迭代器 双向迭代原创 2014-12-25 10:45:30 · 1039 阅读 · 0 评论 -
STL源码分析--仿函数 & 模板的模板参数 & 临时对象
STL源码分析—使用的一些特殊语法关于泛型编程中用到的一些特殊语法,这些语法也适用于平常的模板编程1、 类模板中使用静态成员变量Static成员变量在类模板中并不是很特殊,同时这个变量不属于对象,属于实例化以后的这个类类型。每一个实例化对应一个static变量2、 类模板中可以再有模板成员3、 模板参数可以根据前一个模板参数而设定默认值4、 类模板可以拥有非类型的模原创 2014-12-26 11:48:13 · 1312 阅读 · 0 评论 -
STL源码分析--空间配置器的底层实现 (二)
STL源码分析—空间配置器空间配置器中门道在STL中的容器里都是使用统一的空间配置器,空间配置器就是管理分配内存和销毁内存的。在STL将在heap空间创建一个对象分为两个步骤,第一是申请一块内存,第二是在这块内存中初始化一个对象。首先申请空间是由malloc提供,初始化一个对象时由constructor管理。销毁一个对象也是由两步骤完成,第一是销毁空间上的对象,第二是释放这块内存。同时原创 2014-12-26 14:50:49 · 962 阅读 · 0 评论 -
深入探索C++对象模型--指针类型 & 多态机制
指针的类型不同类型的指针,从内存需求的观点来说,没有什么不同!他们三个都需要足够的内存来繁殖一个机器地址,“指向不同类型之各指针”之间的差异,既不在其指针表示法不同,也不再其内容(代表一个地址)不同,而是在其所寻址出来的对象类型不同。也就是说,“指针类型”会导致编译器如何解释某个特定地址中的内存内容及其大小1、 一个指向地址1000的整数地址,在32位机器上,将涵盖地址空间1000~10原创 2014-12-27 12:23:37 · 1444 阅读 · 0 评论 -
C++ primer(十)--对象和类 共有/私有类访问、 构造/析构函数
以前都是从C到C++过度的时期,从这开始才是真正的C++精华的开始。OOP的最重要的特性:抽象封装和数据隐藏多态继承代码的可重用行 这一文章会设计关于类的所有初级基础知识。关于面向过程编程和面型对象编程解释中一句很关键的话,用户与数据交互的方式有三种:初始化、更新和报告--这就是用户接口。采用OOP方法时,首次从用户的角度考虑对象--描述对象所需的数据以及描述用户与数据交互所需的原创 2013-10-09 09:43:48 · 1621 阅读 · 0 评论 -
C++ const引用、临时变量 引用参数
C++引用—临时变量、引用参数和const引用如果实参与引用参数不匹配,C++将生成临时变量。如果引用参数是const,则编译器在下面两种情况下生成临时变量: 实参类型是正确的,但不是左值 实参类型不正确,但可以转换为正确的类型左值参数是可被引用的数据对象,例如,变量、数组元素、结构成员、引用和被解除引用的指针都是左值,非左值包括字面常量和包含多项式原创 2015-02-05 11:48:25 · 6196 阅读 · 0 评论