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后,就不需要每次都设置配置了。