C++
文章平均质量分 76
daidodo
这个作者很懒,什么都没留下…
展开
-
用C++求最长递增子序列
给定一个无序整数序列,怎样求其最长递增子序列?#include #include void MaxIncreaseQueue(const std::deque & source,std::deque & result){ typedef std::deque IntArray; //怎样从source中得到最长递增子序列放到result中?}经过分析我们发现,首先,我们要得到这个序列的原创 2005-12-25 19:34:00 · 4951 阅读 · 1 评论 -
__mt_alloc源码分析(4)
class __pool终于,我们要开始研究mt allocator里最核心的东西了。__pool是实际上的内存池类,以前我们介绍的那么多类,都是在它的基础上建立起来的“上层建筑”。 188 template189 class __pool; 这是__pool的原型,模板参数_Thread表示是否支持多线程。接着分别对_Thread为false和true的情原创 2008-05-21 15:29:00 · 951 阅读 · 0 评论 -
__mt_alloc源码分析(5)
__pool的内存分配本节研究__pool在分配内存时做的事情。回忆一下__mt_alloc:: allocate函数的内容,一般情况下用户通过某个bin的_M_first[0]可以得到想要的内存,但是在_M_first[0]为0时,__mt_alloc:: allocate调用了: 701 // Null, reserve.702 __c = __pool原创 2008-05-21 18:08:00 · 741 阅读 · 0 评论 -
__mt_alloc源码分析(6)
class __pool__pool是多线程下的内存池类型。在某些方面,它是__pool的扩展,但是在其他很多方面,它比__pool要复杂得多。__pool的基类也是__pool_base,所以它继承了__pool_base的所有成员变量,包括_M_options,_M_binmap和_M_init。同时__pool_base::_Tune和__pool_base::_Block_addres原创 2008-05-22 11:27:00 · 786 阅读 · 0 评论 -
__mt_alloc源码分析(2)
struct __per_type_pool_policy 在继续深入到__common_pool_base和其他pool类里面之前,我好奇的看了下__per_type_pool_policy的定义,发现一些事情,于是决定先说说它。 545 /// @brief Policy for individual __pool objects.546 template cla原创 2008-05-19 21:16:00 · 2139 阅读 · 0 评论 -
__mt_alloc源码分析(3)
struct __common_pool__common_pool是__common_pool_base的基类,它作用就是定义pool_type和实现_S_get_pool函数。 382 template class _PoolTp, bool _Thread>383 struct __common_pool __common_pool的原型,模板参数_Po原创 2008-05-20 14:22:00 · 971 阅读 · 0 评论 -
__mt_alloc源码分析(1)
本文从源代码级别研究mt allocator的内部实现,使用GCC 4.1.2版本的源码,主要源文件为库文件和GCC源码中的“libstdc++-v3/src/ mt_allocator.cc”。假定读者对mt allocator的原理已有一定的了解。 class __mt_alloc为避免一开始就深入到复杂的内存分配机制里,我采用从上往下的研究方法。最顶层自然是提供给用户使用的_原创 2008-05-18 14:41:00 · 3015 阅读 · 1 评论 -
__mt_alloc源码分析(7)
__pool的初始化__pool的初始化工作同样包括2个部分,对象构造和初始化。 356 explicit __pool() 357 : _M_bin(NULL), _M_bin_size(1), _M_thread_freelist(NULL) 358 { }359 360 explicit __pool(co原创 2008-05-23 16:15:00 · 1006 阅读 · 0 评论 -
__mt_alloc源码分析(10)
__pool::_M_reserve_block最后,当线程自己的空闲块没有的时候,__mt_alloc必须向内存池的全局空闲块链表求援,于是进入了_M_reserve_block函数。 312 char* 313 __pool::_M_reserve_block(size_t __bytes, const size_t __thread_id) _M_re原创 2008-05-26 10:37:00 · 848 阅读 · 0 评论 -
__mt_alloc源码分析(8)
__gnu_cxx::lockOK,现在是时候研究lock了。它的定义在GCC源码的“libstdc++-v3/include/bits/concurrence.h”文件里,以下简称concurrence.h。 79 /// @brief Scoped lock idiom.80 // Acquire the mutex here with a constru原创 2008-05-26 10:26:00 · 1050 阅读 · 0 评论 -
__mt_alloc源码分析(9)
__pool的内存分配虽然我在前面已经介绍过__mt_alloc::allocate函数,但是结合这里的多线程环境,我建议读者还是回顾一下它的代码。其实__mt_alloc::allocate函数并不关心内存池是多线程还是单线程的,它在2种环境下都采用统一的操作步骤,只是在单线程的时候其中有些步骤什么事情都不用做,于是我们前面就忽略了。而到了多线程下,每个步骤都变得有用和必需了。 __原创 2008-05-26 10:32:00 · 1007 阅读 · 0 评论 -
__mt_alloc源码分析(11)
__pool的内存释放多线程内存池__pool的内存释放工作主要由函数_M_reclaim_block完成。 250 void251 __pool::_M_reclaim_block(char* __p, size_t __bytes) 函数原型,参数__p为用户释放的内存块地址,__bytes为内存块字节大小。 252 {253原创 2008-05-27 11:36:00 · 942 阅读 · 0 评论 -
__mt_alloc源码分析(12)
__pool的销毁终于,我们来到了最后一站,本节完后,整个mt allocator源码分析也就结束了。和__pool一样,_M_destroy函数其实从未被调用过,但是为了保持设计的完整性,这个函数还是有意义的。 209 void210 __pool::_M_destroy() throw() _M_destroy函数原型。 211 {21原创 2008-05-27 13:03:00 · 908 阅读 · 0 评论 -
CppUnit 入门
简单测试用例(Simple Test Case)如果你想知道你的代码是否运行正确,你该怎么做?有很多方法。通过debugger单步调试或者给你的代码里面乱填一些输出流是两种最简单的方法,但是它们都有缺点。单步调试虽然好但不能自动完成,每当你的代码变化时都不得不重新来。输出文本的方法也好,但是它会把代码弄得很不好看,并且大多数情况下,产生比你需要多得多的信息。用CppUnit测试能够自动运行翻译 2008-06-14 09:43:00 · 1832 阅读 · 0 评论 -
多线程下的返回值优化陷阱
“函数的返回值优化”是我们对程序的一个常见优化手段。只要可能,我们都应该返回对象的有效引用,而不是重新生成一个临时对象。但是,也许这种想法在多线程里需要更仔细的斟酌一下。我从一个简单例子讲起:templateclass FdMap{ std::vector vec_;public: void Set(int fd,const T & v){原创 2008-10-10 19:39:00 · 1273 阅读 · 6 评论 -
多线程的内存分配器mt_alloc
A fixed-size, multi-thread optimized allocator原文URL:http://list.cs.brown.edu/people/jwicks/libstdc++/html/ext/mt_allocator.html简介mt allocator是一个固定大小(2的幂)内存的分配器,最初是为多线程应用程序(以下简称为MT程序)设计的。经过多年的改进,翻译 2008-05-16 12:26:00 · 6971 阅读 · 0 评论 -
Using GCC’s C++ Compiler
本文讨论GNU编译器集合(GCC)中的C++编译器(g++)的典型用法,主要是指命令行选项的构造。GCC的C++编译器正常安装后,可以使用g++或c++命令执行。GCC Option Refresher本节回顾GCC的C编译器的基本使用方法。g++编译器的选项可以是单字符,比如-o,也可以多字符,比如-ansi。所以你不可以把多个单字符选项合写到一起,这和许多其他GNU和UNI翻译 2008-03-15 14:41:00 · 3364 阅读 · 0 评论 -
Optimizing Code with GCC
现在的编译器越来越聪明,功能越来越强,从简单的函数内联,到复杂的寄存器分析,一系列代码革命使程序运行得越来越快。大多数时候,更快比更小重要,因为磁盘空间和内存都变得便宜了。但是在嵌入式系统里,更小和更快是一样重要的,所以把代码进行优化是非常有意义的工作。如果你已经知道了怎样用gcc编译你的代码,现在是时候让你的代码更快或者更小了,这也是本章的内容。如果学有所成的话,你甚至可以让你的下一个程序既翻译 2008-03-15 14:42:00 · 5524 阅读 · 1 评论 -
C++里怎样定义递归函数指针
在C++里说到函数指针,有很多人都是避而远之,更别说什么“递归函数指针”了。但是实际上有的东西越是神秘,其原理反而越简单,所以我这里就先卖一个关子,假装介绍一个“高深的技巧”一样做这个开场白了。什么是“函数指针”呢?(别砸我!我想从头开始讲)比如我们定义了一个函数:int f(char); 我们先不管它的实现,我们只知道它的申明,那么我们就可以定义一个函数指针fp来指向它:Fu原创 2005-12-26 17:41:00 · 3483 阅读 · 0 评论 -
在错误信息里输出N以内的素数
以前在MCD上听说过,又见过几个讨论,忘了在哪里,也没弄清楚怎么实现的,今天中午试了一下,居然成功了,高兴ing!贴出来,与大家分享:(VS.NET 2005)templatestruct CanDivid //whether N can be divided by (2 to M){ enum{Result = (N % M == 0 || CanDivid::Result)原创 2006-04-17 14:41:00 · 1104 阅读 · 0 评论 -
上次素数程序增强版
template bool R, long M, templateclass T>struct Selector_Ext{ typedef T RType;};template long M, templateclass T>struct Selector_Ext{ typedef typename Selector_Ext::IsPrime,M原创 2006-04-24 21:09:00 · 1270 阅读 · 0 评论 -
仿照std::map定制一个Dictionary
以前在做一个编译器的时候,碰到这样一个问题:编译器把所有的标识符(identifier)字符串存储在一个String Table中,其实就是一个std::vector,便于用数字来引用,但是在查找时却要根据字符串来匹配,速度显然不行。于是我不得不自己编一个Dictionary,存储的是值对,Entry是这个标识符的入口,而__int64则是该标识符在String Table中的索引,查找时也是根据原创 2006-04-30 18:17:00 · 2046 阅读 · 0 评论 -
求类成员在类中的偏移量
在一个论坛的帖子里看到了,觉得有用,收藏一下:templatelong mem_offset(long T::* off){ //求类成员off在类T中的偏移量 return *(long *)&off;}#define MEM_OFFSET(TYPE,MEMBER) (mem_offset((long TYPE::*)&TYPE::MEMBER))测试:#includ原创 2006-11-28 21:10:00 · 1449 阅读 · 0 评论 -
函数模版重载之iterator_traits技巧
以下皆在MS VS2005下测试运行。大家都知道在标准STL里的vector容器有这样2个构造函数:1)vector(size_type sz,value_type val);2)templatevector(InputIterator first,InputIterator last);其意义分别是:1)初始化一个大小为sz,所有元素值都为val的vector;2)由first原创 2006-12-06 14:17:00 · 1821 阅读 · 0 评论 -
把其他C/C++编译器集成到VC2005中
在Visual C++ 2005中,如何调用其它编译器编译cpp文件呢? 换句话说,如何把其它编译器集成到VC2005的IDE中呢? 本文介绍了一种简单的方法。 在Visual C++ 2005中,如何调用其它编译器编译cpp文件呢? 换句话说,如何把其它编译器集成到VC2005的IDE中呢?象ICC这样的编译器安装之后会自动集成进来,要集成其他编译器那还得自己动手。下面介绍一种转载 2006-12-29 13:47:00 · 921 阅读 · 0 评论 -
大整数类的实现(1)(原创)
每次上论坛都能找到类似求100!的问题,其实这些题目归根究底就是一个大整数类的实现。一般大家提到的方法是用数组,每个数字要么表示一个10进制位,要么表示几个10进制位。我觉得这样虽然在对“人”是直观了,但是对“电脑”却非常不直观,所以我觉得应该按照计算机的2进制表示方式来实现。 按照自己的想法,我写了这样一个大整数类,内部用long的数组来表示,是在2进制层面,即原创 2008-02-24 14:34:00 · 2779 阅读 · 0 评论 -
大整数类的实现(2)(原创)
3.SignedHugeLong.h————————————————————————————————————/* * Copyright (c) 2005 by DoZerg. ALL RIGHTS RESERVED. * Consult your license regarding permissions and restrictions. */#pragma once#inclu原创 2008-02-24 14:36:00 · 672 阅读 · 0 评论 -
大整数类的实现(4)(原创)
5.Helper.h————————————————————————————————————/* * Copyright (c) 2005 by DoZerg. ALL RIGHTS RESERVED. * Consult your license regarding permissions and restrictions. */#pragma once#includename原创 2008-02-24 14:37:00 · 773 阅读 · 1 评论 -
大整数类的实现(3)(原创)
本来现在我应该要介绍HugeNumberBase的实现了,但是我不准备在这里介绍。因为HugeNumberBase的实现是需要详细解说的,可能要花上不久的时间和不少的篇幅,我觉得可能先等我把所有其他“外围”代码都解决完了,再来专心对付这个“核心”会比较好,所以我这里介绍DataAllocation.h和Helper.h的实现。 4.DataAllocation.h————————原创 2008-02-24 14:37:00 · 735 阅读 · 0 评论 -
大整数类的实现(7)(原创)
3)———————————————————————————————————————————————— templateclass __Alloc> HugeNumberBase & HugeNumberBase::RightShift(){ for(long i=N-1;i>0;--i) data_[i]=(data_原创 2008-02-24 14:39:00 · 802 阅读 · 0 评论 -
大整数类的实现(5)(原创)
5.HugeNumberBase.h————————————————————————————————————————/* * Copyright (c) 2005 by DoZerg. ALL RIGHTS RESERVED. * Consult your license regarding permissions and restrictions. *//**************原创 2008-02-24 14:38:00 · 830 阅读 · 0 评论 -
大整数类的实现(6)(原创)
2)—————————————————————————————————————————— templateclass __Alloc> bool HugeNumberBase::EqualValue(unsigned long value) const{ if(data_[N-1]==value){ for(long原创 2008-02-24 14:39:00 · 1150 阅读 · 0 评论 -
无锁(lock-free)数据结构
提到并行计算通常都会想到加锁,事实却并非如此,大多数并发是不需要加锁的。比如在不同电脑上运行的代码编辑器,两者并发运行不需要加锁。在一台电脑上同时运行的媒体播放放器和代码编辑器,两者并发运行不需要加锁(当然系统调用和进程调度是要加锁的)。在同一个进程中运行多个线程,如果各自处理独立的事情也不需要加锁(当然系统调用、进程调度和内存分配是要加锁的)。在以上这些情况里,各个并发实体之间没有共享数据,所以转载 2009-02-17 16:41:00 · 6553 阅读 · 1 评论