厚积薄发
海纳百川,有容乃大

随笔分类 -  C++

1
关于字符集,编码格式,大小端的简单总结
摘要:谁知道Windows为什么不用UTF8,非要搞得和其他平台不一样? 阅读全文
posted @ 2015-07-25 01:22 Richard Wei 阅读(2649) 评论(1) 推荐(0) 编辑
理解数组
摘要:简单总结下,我们从C++的内置数组讲到标准库提供的vector, 最后谈到C++11新增的array, 数组这个最基本的数据结构在C++中终于有了完整的支持。 阅读全文
posted @ 2014-05-12 22:12 Richard Wei 阅读(848) 评论(0) 推荐(1) 编辑
C++中new和delete的背后
摘要:我们可以看到数组new[]和delete[]的关键是, C++编译器在数组起始地址之前的4个字节保存了对象的数量N,后面会根据这个数量值进行N次的构造和析构 。 我们可以看到C++ 编译器在背后干了很多事情,可能会内联我们的函数, 也可以修改和产生其他一些函数, 而这是很多C开发者受不了的事情, 所以在内核级别, 很多人宁愿用C来减少编译器背后的干扰。 阅读全文
posted @ 2013-11-17 21:25 Richard Wei 阅读(687) 评论(0) 推荐(0) 编辑
智能指针与库
摘要:越抽象的东西离底层机器就越遥远, C++隔着复杂的编译器, Java/C#隔着虚拟机, 脚本语言隔着解释器, 这就是高级语言的代价。 阅读全文
posted @ 2013-06-20 22:44 Richard Wei 阅读(861) 评论(0) 推荐(0) 编辑
C++程序风格的思考
摘要:最近有机会看号称是公司最核心的代码, 因为这个代码以前一直是美国那边保密的, 这么重要的代码会是啥样子? 真正拿到手大致看了一下后却挺失望的,因为该代码风格基本上是我刚毕业时的C++风格----带类的C,单从代码上看写的挺滥,里面没啥设计模式, 也没有用模板, 代码里面甚至一个函数可以写上近千行。 这么重要的代码, 竟然是这种风格, 由此思考好的C++程序应该是什么风格? 阅读全文
posted @ 2013-04-27 23:40 Richard Wei 阅读(2025) 评论(6) 推荐(3) 编辑
C++中基于Crt的内存泄漏检测
摘要:尽管这个概念已经让人说滥了 ,还是想简单记录一下, 以备以后查询。 阅读全文
posted @ 2013-02-25 22:33 Richard Wei 阅读(1927) 评论(1) 推荐(3) 编辑
在C++中实现事件(委托)(续)
摘要:在上文 在C++中实现事件(委托) 中我们实现的C#里委托方式的事件处理, 虽然使用很方便,但是感觉似乎少了一点C#的味道, 下面我们尝试把它改成真正的C#版。 其实要改成真正的C#版,我们主要要做2件事, 一是吧CEventHandler放到外面,可以让外部直接构造, 二是实现operator +=和operator -= 阅读全文
posted @ 2013-01-31 17:46 Richard Wei 阅读(2987) 评论(5) 推荐(2) 编辑
在C++中实现事件(委托)
摘要:在C++中实现回调机制的几种方式一文中,我们提到了实现回调的三种方式(C风格的回调函数, Sink方式和Delegate方式)。在面向对象开发中,delegate的方式是最灵活和方便的,因此很早就有人用复杂的模板去模拟, 实现起来很复杂。但是现在借助C++11的function和bind, 我们可以很方便的去实现。 阅读全文
posted @ 2013-01-31 14:23 Richard Wei 阅读(2507) 评论(2) 推荐(2) 编辑
C++模板会使代码膨胀吗
摘要:通过上面的分析 ,相信我们知道了为什么ATL/WTL大量使用模板,但是生成的exe还是这么小的原因 : 不是模板不会使代码膨胀,而是ATL/WTL在设计时就关注了这个问题 ,它避免了在可能生成很多模板实例的模板类中编写大量代码(有些拗口,不知道你有没有读懂^_^) 总结下 ,如果你想用模板,但是又不想 让自己最终的可执行文件变的很大, 有2种方式: (1)你的模板类不会生成很多模板实例,这样写成模板类还有意义吗? (2)你的模板类的代码量或是函数个数很少,你可以仿照ATL的方式把模板无关的东西逐层剥离。 阅读全文
posted @ 2012-11-08 22:56 Richard Wei 阅读(3413) 评论(6) 推荐(2) 编辑
重构ATL中的CAutoVectorPtr, CAutoPtr和CAutoStackPtr
摘要:看到ATL中有3个类的代码比较比较重复,在atlbase.h中,分别是CAutoVectorPtr,CAutoPtr和CAutoStackPtr,他们的功能其实很类似STL中的autoptr, 但是这里因为针对不同的分配对象而用了3个不同的类,其中CAutoVectorPtr是针对数组类型的,CAutoPtr是针对普通的非数组类型,而CAutoStackPtr针对的是_malloca分配的类型,因为最后释放方式的不同,它这里用了3份代码来实现。CAutoVectorPtr:template<typenameT>classCAutoVectorPtr{public:CAutoVect 阅读全文
posted @ 2012-09-24 23:10 Richard Wei 阅读(1596) 评论(5) 推荐(0) 编辑
探索C++对象模型
摘要:总之,拿着一把刀,庖丁解牛般的剖析语言背后的实现细节,看起来不是那么实用,但是它能让你对语言的理解更深刻。实际上ATL中大量应用上面的技术,如果没有对C++ 对象模型有比较深刻的理解,是很难深入下去的。 阅读全文
posted @ 2012-09-21 23:08 Richard Wei 阅读(2829) 评论(3) 推荐(4) 编辑
理解C++变量存储模型
摘要:通过上面的分析,我们验证了平时C++书上关于各种类型变量存储区域的假设,简单来说就是全局变量和静态变量会被编译到可执行文件的数据节(分只读和可读写)中, 非静态的局部变量则分配在堆栈(stack)上,而new(malloc)出来的内存则分配在堆(heap)上。 阅读全文
posted @ 2012-09-20 22:02 Richard Wei 阅读(1733) 评论(5) 推荐(1) 编辑
C/C++中可变参数的原理
摘要:从上面的例子我们可以看到,对于可变参数的函数,有2种东西需要确定,一是可变参数的数量, 二是可变参数的类型,上面的例子中,参数数量我们是在第一个参数指定的,参数类型我们是自己约定的。这种方式在实际使用中显然是不方便,于是我们就有了_vsprintf, 我们根据一个格式化字符串的来表示可变参数的类型和数量,比如C教程中入门就要学习printf, sprintf等。 总的来说可变参数给我们提供了很高的灵活性和方便性,但是也给会造成不确定性,降低我们程序的安全性,很多时候可变参数数量或类型不匹配,就会造成一些不容察觉的问题,只有更好的理解它背后的原理,我们才能更好的驾驭它。 阅读全文
posted @ 2012-09-18 00:29 Richard Wei 阅读(9914) 评论(1) 推荐(7) 编辑
C++中模块(Dll)对外暴露接口的几种方式
摘要:当然,上面几种DLL对外暴露接口的方式本质上没有区别,都是利用PE文件的导出节来导出数据和函数,但是根据它们使用方式的不同,对外部模块来说还是有很大的区别,我们的推荐次序依次是:COM方式->导出API函数方式->导出类方式。 阅读全文
posted @ 2012-08-29 19:04 Richard Wei 阅读(7429) 评论(0) 推荐(1) 编辑
C++中实现回调机制的几种方式
摘要:最后简单比较下上面3种实现回调的方法: 第一种Callback的方法是面向过程的,使用简单而且灵活,正如C语言本身。 第二种Sink的方法是面向对象的,在C++里使用较多, 可以在一个Sink里封装一组回调接口,适用于一系列比较固定的回调事件。 第三种Delegate的方法也是面向对象的,和Sink封装一组接口不同,Delegate的封装是以函数为单位,粒度比Sink更小更灵活。 阅读全文
posted @ 2012-08-28 12:43 Richard Wei 阅读(10014) 评论(9) 推荐(6) 编辑
C++11新特性不完全测试
摘要:摘要: Lambda, auto, 统一初始化,智能指针,Regex, Random, function and bind, hash_map… 右值引用和Move语义, 并发(多线程库)…发布阅读全文Richard Wei 2012-06-06 17:34 发表评论 阅读全文
posted @ 2012-06-06 17:34 Richard Wei 阅读(204) 评论(0) 推荐(0) 编辑
如何判断一个C++对象是否在堆上
摘要:摘要: 在帖子 "如何判断一个C++对象是否在堆栈上” 中, 又有人提出如何判断一个C++对象是否在堆上。阅读全文Richard Wei 2012-05-12 14:30 发表评论 阅读全文
posted @ 2012-05-12 14:30 Richard Wei 阅读(332) 评论(0) 推荐(0) 编辑
如何判断一个C++对象是否在堆栈上
摘要:摘要: 要解答这个问题,其实就是要知道的堆栈的起始地址, 而我们知道堆栈其实就是一段有相同属性的内存页面阅读全文Richard Wei 2012-05-12 10:57 发表评论 阅读全文
posted @ 2012-05-12 10:57 Richard Wei 阅读(549) 评论(0) 推荐(0) 编辑
一个高效的内存池实现
摘要:摘要: 在高效C++编程中看到一个不错的内存池实现方案,这里共享下,大家看看有什么不足。阅读全文Richard Wei 2012-05-05 23:23 发表评论 阅读全文
posted @ 2012-05-05 23:23 Richard Wei 阅读(317) 评论(0) 推荐(0) 编辑
引用计数的智能指针的实现与思考
摘要:摘要: 引用计数在软件开发中是一项非常重用的技术,它可以说是无处不,我们在不知不觉中都在和它打交道,比如 Windows上的COM和Handle, Mac上的ref句柄,脚本语言中的垃圾回收技术。阅读全文Richard Wei 2012-05-05 17:04 发表评论 阅读全文
posted @ 2012-05-05 17:04 Richard Wei 阅读(244) 评论(0) 推荐(0) 编辑

1