程序通用算法和库


1性能分析统计

LARGE_INTEGER t1, t2, tc; 
QueryPerformanceFrequency(&tc); 
printf("Frequency: %u\n", tc.QuadPart); 
QueryPerformanceCounter(&t1); 
Sleep(1000); 
QueryPerformanceCounter(&t2); 
printf("Begin Time: %u\n", t1.QuadPart); 
printf("End Time: %u\n", t2.QuadPart); 

printf("Lasting Time: %u\n",(t2.QuadPart- t1.QuadPart)); 

性能分析工具 INTEL VTUNE DPS

2 高效双消息队列

A B两个队列接受和处理
锁定操作, 提取,放入,切换等
配合高效的BUFF保存消息 
避免了内存开启和释放

 

3 通用程序库

XML:tinyxml   rapidxml 
ZIP ZLIB
BOOST 内存池

ptree操作XML,INI

 

4容器操作

 voidprint(int &elem){cout<<elem<<" ";} 
 vector<int> myvector(8,10);        // myvector: 10 10 10 1010 10 10 10

 fill_n(myvector.begin(),4,20);     // myvector: 20 20 20 20 10 1010 10
 for_each(V.begin(),V.end(),print);  // 自定义函数


5智能指针

std:aut_ptr 标准库的智能指针析构时释放内存  不可用作容器的元素
auto_ptr<int> pInt(new int(123)); 

// share_ptr 非常重要自由复制拷贝.引用计数0时析构可放入容器引用计数型指针

shared_ptr<int> pShare(newint(10));

pShare.unique(); // 是否唯一所有者

shared_ptr<int> pShare2 =pShare; //复制指向同一内存

int share_count = pShare.use_count();//引用次数

*pShare = 123; // 所有指针内容相同
 

// 使用share,取消了delete调用make_shared()替换new

shared_ptr<string> pStr =make_shared<string>("change new func!");

shared_ptr<vector<int>>pVct = make_shared<vector<int>>(10, 5);

// 用于容器

vector<shared_ptr<int>>vct_ps;

vct_ps.resize(10); // 全部为空指针

vct_ps[0] =make_shared<int>(0); //初始化

 

// 定制删除行为

shared_ptr<FILE>fp(fopen("text.xml", "r"), fclose);

size_t file_size;

fseek(fp.get(), 0, SEEK_END);

file_size = ftell(fp.get()); 

 
//
任何退出函数
shared_ptr<void> p((void*)0, any_func);
  

// weak_ptr 观察者指针

weak_ptr<FILE> p_weak = fp;

 

// 观察智能指针,无失效可获取

if (!p_weak.expired())

{

// 通过LOCK获取智能指针

shared_ptr<FILE> fp1 =p_weak.lock();

}

 

boost::shared_ptr的特点:

和前面介绍的boost::scoped_ptr相比,boost::shared_ptr可以共享对象的所有权,因此其使用范围基本上没有什么限制(还是有一些需要遵循的使用规则,下文中介绍),自然也可以使用在stl的容器中。另外它还是线程安全的,这点在多线程程序中也非常重要。

boost::shared_ptr的使用规则:

boost::shared_ptr并不是绝对安全,下面几条规则能使我们更加安全的使用boost::shared_ptr:

避免对shared_ptr所管理的对象的直接内存管理操作,以免造成该对象的重释放

shared_ptr并不能对循环引用的对象内存自动管理(这点是其它各种引用计数管理内存方式的通病)

不要构造一个临时的shared_ptr作为函数的参数。

如下列代码则可能导致内存泄漏:

foo(boost::shared_ptr<implementation>(new   implementation()),g());

正确的用法为:

boost::shared_ptr<implementation> sp   (new implementation());

foo(sp,g());

 

6MFC提示 NEW DELETE 已定义

     问题为MFC库和WINDOWS库的包含顺序问题
     在工程设置里面 设置 MFC 共享方式使用MFC库 即可

7BOOST 内存池

// 原生态类型 不调用构造 直接开内存

pool<> pool_pod(sizeof(int));

int* pInt = (int*)pool_pod.malloc();

if (pInt != NULL) *pInt = 123;

 

// 待测试效率
pool<> pool_buffer(12223);

void* pBuffer = pool_buffer.malloc();

if (pBuffer != NULL) memcpy(pBuffer, pInt, 4);

 

// 对象类型内存池 调用类的构造和析构

object_pool<string> pool_string;

string* pString =pool_string.construct("maple");

 

// 单件内存池 线程安全

typedef singleton_pool<struct pool_tag, sizeof(int)>pool_single;

int* p = (int*)pool_single::malloc();

*p = 12345;

pool_single::release_memory();// 释放内存-未使用的

pool_single::purge_memory();//释放内存

 

8BarChart_demo 柱状图

很不错的C++编写的柱状图控件类 代码比较清晰,
内部的类再分开的话就好了

9 正则表达式 xpressive

查找和替换等 比较方便

10 BOOST_ASSERT

可以定制断言触发函数 assertion_failed,减少编写代码

 

11 BOOST_FOREACH 循环容器

减少很多代码,可直接取容器内对象

BOOST_FOREACH(MAP::VALUE_TYPE& it, map)

可直接取出对象.

 

12 BOOST 随机数的使用

 

13 signals2库 代理事件功能 观察者模式

Signal<void()> sig; // 定义信号对象

Sig.connect(&func1); // 连接函数 --可定义分组,使用组号保持执行顺序

Sig(); // 调用/触发 函数执行.

可通过在定义时,自定义合并器,达到控制终止迭代,跳出调用.

 

14 BOOST thread 和 asio

锁定互斥功能跨平台线程功能

Asio用于多种IO读写,定时器功能,网络通信.

15 BOOST 使用 PYTHON

和LUA一样,可交互,直接调用.相互访问.

 

16 NAV导航网格寻路

凸多边形的寻路方式,百度文库收集,解决Z字形行走,取消布点.

 

17 解决VS2010  1123错误

终极解决方案:
VS2010
在经历一些更新后,建立Win32 Console Project时会出“error LNK1123” 错误,解决方案为将 项目|项目属性|配置属性|清单工具|输入和输出|嵌入清单 “改为即可,但是没新建一个项目都要这样设置一次。
在建立VS2010 Win32 Project项目时,按照上面解决方案依然发生了“error LNK1123”错误,经过上网查资料,解决方案为:
第一步:与上相同。
第二步:将 项目|项目属性|配置属性|连接器|清单文件|嵌入清单 “改为
第三步:一般计算机经过上两步设置就能解决问题了,但是如果还有问题,那就按一下方法解决:
计算机是否为64bit操作系统,如是,继续2
查找是否有两个cvtres.exe。一个是C:\Program Files(x86)\Microsoft Visual Studio 10.0\vc\bin\cvtres.exe 另一个是C:\Windows\Microsoft.NET\Framework\v
4.0.30319\cvtres.exe
。右键属性|详细信息 查看两者版本号,删除/重命名较旧的版本,或者重新设置Path变量。

意外的是,治本的办法是第三步,删除旧版本的cvtres.exe后,就不需要每次都设置配置了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值