C/C++
文章平均质量分 72
晨星
熟练掌握C++程序设计语言,酷爱读书。
展开
-
【译】C++回调(CallBack)方案
steedhorse(晨星)译 文章出处: http://www.partow.net/programming/templatecallback/问题提出 解决方案 模板的使用 可变参数回调模板 未来展望 一条小提示 最终的考量 兼容性 资源 问题提出 跟诸如Object Pascal和Ada等其它一些语言不同,C++语言并没有内在地提供翻译 2005-03-25 15:36:00 · 7024 阅读 · 3 评论 -
蒙特卡罗算法计算圆周率PI(C++)
蒙特卡罗(Monte Carlo)算法计算圆周率的主要思想:给定边长为R的正方形,画其内切圆,然后在正方形内随机打点,设点落在圆内的概为P,则根据概率学原理:P = 圆面积 / 正方形面积 = PI * R * R / 2R * 2R = PI / 4。即 PI=4P。这样,当随机打点足够多时,统计出来的概率就非常接近于PI的四分之一了。#include #include原创 2010-04-27 09:33:00 · 17565 阅读 · 5 评论 -
右值引用简介(中英文对照)
[译注:原文出处:http://www.artima.com/cppsource/rvalue.html][译注:本文介绍的“右值引用”是C++11的新特性]A Brief Introduction to Rvalue Referencesby Howard E. H翻译 2011-10-07 10:56:50 · 6288 阅读 · 4 评论 -
一个BUG
解决了一个很隐蔽的BUG,就在刚才。写了一个类,其对象实例需在多线程中使用,因此打算把互斥机制封装在类的内部。于是在类里定义了一个boost::mutex类型的变量,取名叫“mutex_”。在成员函数中使用的时候,用这个mutex_对象初始化一个局部锁:mutex::scoped_lock lock(mutex_);然后写了个单元测试,创建三个线程,每个线程调用对象的某原创 2008-12-28 16:52:00 · 1843 阅读 · 3 评论 -
sizeof、pack和alignment
本文简单总结了在考虑字节对齐的前提下,计算对象size的基本规则。但本文只说结论,不讨论初衷和更深奥的原理。有兴趣的朋友可以读读这个:http://msdn.microsoft.com/en-us/library/aa290049(VS.71).aspx 为方便叙述,我们先定义一个概念:“对齐要求”(Alignment Requirement),并用AR来表示,即编译器将把一个对象m对齐到原创 2009-09-04 16:24:00 · 1691 阅读 · 5 评论 -
漫谈C++内存分配失败
没错,是“漫谈”,而且“漫”得有点乱。然而,抛砖尚可引玉,想到的事情,纵然脉络不是很畅,写下来也不是坏事。开卷有益,动笔也有益。 一切缘自一位C语言开发经验非常丰富的的朋友问我的一个问题。朋友问:“C++中的new在分配内存失败时会抛出异常(std::bad_alloc)而不返回0(一些老的编译器可能还在返回0,但这样的编译器实在“太老了”),这跟C程序员的做法很不一样。而且,许多C++程原创 2011-10-19 00:26:44 · 16617 阅读 · 32 评论 -
两个古老问题的递归算法。
1. 全排列思路1:递归分治(基于交换)#include void perm(int* a, int start, int end);void swap(int& m, int& n);void output(const int* a, int size);int main() { int a[5] = {1, 2, 3, 4, 5}; perm(a, 0,原创 2011-08-31 17:45:22 · 2458 阅读 · 0 评论 -
从一个修改私有变量的问题想到的
前几天,在论坛里看到一个帖子,内容是:(原帖见:http://community.csdn.net/Expert/topic/5014/5014384.xml?temp=.3018152 )========================================class a{private: int k;};要求不用友元,不在这个类里添加任何代码原创 2006-09-22 02:39:00 · 4743 阅读 · 10 评论 -
sprintf,你知道多少?
printf可能是许多程序员在开始学习C语言时接触到的第二个函数(我猜第一个是main),说起来,自然是老朋友了,可是,你对这个老朋友了解多吗?你对它的那个孪生兄弟sprintf了解多吗?在将各种类型的数据构造成字符串时,sprintf的强大功能很少会让你失望。 由于sprintf跟printf在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。这原创 2005-03-25 15:29:00 · 16794 阅读 · 13 评论 -
精确计算100的阶乘(C++)
#include #include using namespace std;void calc(vector& v);void print_result(const vector& v);int main() { vector v; calc(v); print_result(v); return 0;}void calc(vecto原创 2010-04-23 16:37:00 · 5500 阅读 · 2 评论 -
递归-回溯法求解8皇后问题(C)
无意中翻出了N年前写的递归-回溯法求解8皇后问题,干粹塞到博客中吧。#include #include #include #define QUEENS 8 // 记录解的序号的全局变量。int iCount = 0; // 记录皇后在各列上的放置位置的全局数组。int Site[QUEENS]; // 递归求解的函数。void Queen原创 2010-05-18 17:29:00 · 4145 阅读 · 1 评论 -
锁的代价
秃子说并发程序的性能瓶颈常常在于锁的滥用。我对此虽深信不疑,却一直没有量化的感性认识。刚才写了个浮点运算小程序一跑,结果有锁无锁性能相差8到10倍。注意,测试程序是单线程的,也就是说这还只是没有实际竞争时的差别。原创 2011-01-25 14:59:00 · 4107 阅读 · 6 评论 -
C++、Java和C#语言在处理“虚拟私有方法”上的差异
运行时动态绑定被调过程的“虚拟方法”(virtual method)机制是实现多态的关键技术。C++、Java和C#(按出生年月排列,上同,下同)作为三种主流的支持对面向对象的程序设计语言,自然都提供了这种动态的方法绑定机制,在这个问题上三兄弟没有谁是含糊的。但当“虚拟”(virtual)和“私有”(private)碰在一起时,这几种语言在处理上却有所不同,本文的故事就是从一段小程序说起的:我原创 2005-03-29 22:19:00 · 3779 阅读 · 4 评论 -
C++学习推荐书目
wingfiring(别逗了)(非典型秃子) 初稿steedhorse(晨星) 整理 (一) 语言入门:v 《C++ Primer》最新版本:第三版(第四版国外已上架,国内一些网上书店也在预订中)适合有丰富C经验,缺乏C++经验的。不过我个人一直认为此书带着过于强烈的C语言的痕迹,对于C++的学习未必是好事。 v 《The C++ P原创 2006-12-15 19:56:00 · 6675 阅读 · 5 评论 -
一个不怎么正确的程序加深一点你对this指针的理解
下面这个程序不见得在每种编译器上都能通过编译,既使通过了编译,也不见得可以成功运行并输出结果。让人欣慰,更让人郁闷的是:它在我的Visual Studio 2005 SP1中,既能顺利编译,也能正常运行。它虽然投机取巧,胡作非为,蝇营狗苟,横行霸道。但它至少能引发你的思考,加深一点你对this指针的理解,如果你还不是十分理解的话。#include using namespace s原创 2008-07-16 16:55:00 · 2154 阅读 · 10 评论 -
打印自然数1到10
最近挺忙的,可不知道为啥,还是愿意把正事丢在一边,琢磨着为自己找点乐子。前两天由于看到Java版一个帖子,竟然越想越好玩,于是又拾起了偶初学BASIC语言时就写得烂熟的一道题目:打印自然数1到10。如果用C++语言来写,会有多少种写法呢? (1)直接循环大多数人的第一反应应该是这样的吧:#include using namespace std; int main() {原创 2008-07-16 00:50:00 · 4293 阅读 · 3 评论 -
front/pop从理论到实践
从STL的std::queue说起STL的std::queue类是个容器适配器,即由其它容器包装而成的特殊数据结构。提到queue,就少不了提及它的两个最重要的操作:往队列尾部填加数据的push和从队列头部弹出数据的pop。本文不打算讨论push,只想考查一下pop。std::queue的pop函数相当简单:void pop();它的唯一作用就是将当前的队首元素从队列中删除。同原创 2009-02-25 00:51:00 · 14333 阅读 · 6 评论 -
Linux获取本机IP、MAC示例程序
#include #include #include #include #include #include #include #include #include using namespace std;void peek_interfaces(int fd);void print_hw_addr(int fd, const char* if_原创 2009-09-24 16:36:00 · 2888 阅读 · 0 评论 -
求整数中比特为1的二进制位数
好几次在CSDN上看到别人讨论如何求出一个整数的二进制表示中状态为1的比特位数。今天写了个程序把从网上看来的加上自己想出来的共有5种方法测试了一下,觉得好玩,就写了这篇博客。首先简单介绍一下这五种方法。第一种:最简单的,通过移位操作逐位测试并计数,不妨称为“逐位测试法”;第二种:注意到对于“单比特二进制”而言,其状态与数值“相同”。即对于单个比特的“数”而言,为0即表示数值0,“原创 2009-11-14 01:05:00 · 11209 阅读 · 5 评论 -
0做除数时
试着编译运行下面的几行小程序:#include int main() { int a = 0; double d = 3 / a; printf("%lf./n", d); return 0;} 正常编译后,运行发生了异常,程序被终止运行,啥也没打印出来。当然问题也是显然的,严重的除0异常。(没有人会写程序故意除以一个零,但难保来自于其它原创 2010-02-25 11:53:00 · 2798 阅读 · 3 评论 -
说说C语言运算符的“优先级”与“结合性”
论坛和博客上常常看到关于C语言中运算符的迷惑,甚至是错误的解读。这样的迷惑或解读大都发生在表达式中存在着较为复杂的副作用时。但从本质上看,仍然是概念理解上的偏差。本文试图通过对三个典型表达式的分析,集中说说运算符的优先级、结合性方面的问题,同时说明它们跟求值过程之间存在的区别与联系。 优先级决定表达式中各种不同的运算符起作用的优先次序,而结合性则在相邻的运算符的具有同等优先级时,决定表达式原创 2010-09-24 23:58:00 · 28082 阅读 · 25 评论