﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-ArthasLee</title><link>http://www.cppblog.com/ArthasLee/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 07 Apr 2026 18:29:57 GMT</lastBuildDate><pubDate>Tue, 07 Apr 2026 18:29:57 GMT</pubDate><ttl>60</ttl><item><title>老板们到底在想什么？</title><link>http://www.cppblog.com/ArthasLee/archive/2014/09/23/208380.html</link><dc:creator>ArthasLee</dc:creator><author>ArthasLee</author><pubDate>Mon, 22 Sep 2014 16:37:00 GMT</pubDate><guid>http://www.cppblog.com/ArthasLee/archive/2014/09/23/208380.html</guid><wfw:comment>http://www.cppblog.com/ArthasLee/comments/208380.html</wfw:comment><comments>http://www.cppblog.com/ArthasLee/archive/2014/09/23/208380.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ArthasLee/comments/commentRss/208380.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ArthasLee/services/trackbacks/208380.html</trackback:ping><description><![CDATA[如果我有幸成为比较famous的人，这篇文章就会被更多的人看到。<br /><div style="text-align: right;">&#8212;&#8212;题记<br /><br /><div style="text-align: left;">老板们到底都在想什么？<br /><br />我从来都不认为单纯的理想就足够运营一间公司，一间公司要生存下去，就必须得盈利。所以从这个角度来看，老板们肯定是想要获得更多的利润而节约更多的成本。所以我不存在太强烈的被迫害妄想，认为资本家总是在榨取我们的剩余价值，总是在戕害我们。我也不认为大老板们或者掌权者需要对我们有多好多好。<br /><br />公司的股东和掌握实权的人想要赚钱我觉得这是无可厚非的。<br /><br />真正让我疑惑的，是<strong>老板和大佬们除了赚钱和利用公司实现个人理想之外</strong>，他们到底还在想些什么呢？<br /><br />坦白说，我感觉现在的环境环境相当的糟糕。当然，&#8220;糟糕&#8221;这个评级是跟我过去的工作环境相比较而获得的。而且在过去的一段时间里，我依然为同一间公司服务。<br /><br /><strong>现在的工作环境怎么个糟糕呢？<br /></strong><br />最近我搬去了一个新的办公环境。<strong>新办公地点的交通没有以前便捷</strong>了，附近的配套设施也更加稀缺&#8212;&#8212;例如<strong>我以前从来不怎么需要担心去午餐和晚餐去哪里吃</strong>。但我现在陷入到不愉快的忧虑中，因为我以后每天上班我都要为每天中午要吃什么，去哪里才能找到吃而头痛。而且即使找到吃的，也不一定代表万事大吉。送外卖可能晚点，好不容易到达了可能少了点东西；食堂据说性价比极其低下；如果我要提高一下餐饮质量我还得徒步去比较远的地方，浪费时间&#8230;&#8230;<br />不得不说，作为一个土生土长的广州人，<strong>我真的很在乎吃这件事</strong>。吃得不好，直接影响我的工作心情。<br /><br />食和行已经变差，情况还能更糟糕点吗？答案是，能。<br />工作环境和设施直线下降一个等级。如果食和行还可以将就，只是魔鬼筋肉人钢铁一般的皮肤下的一个小伤口的话，那办公环境的变坏就简直像是在美国纽约&#8220;种了一个蘑菇&#8221;。<br /><strong>我的工位大小严重缩水</strong>，宽度甚至不够我完全舒展我的双臂。摆放两个24寸的显示器（虽然公司从未给我配备这种规格的装备）就完全没有什么自由空间了。我不再像以前那样能在工位上找张白纸随意写写画画，跟同事说我的构思和想法，也不再像以前一样编程累了可以比较舒服地趴在工位上打个盹。狭窄的桌面迫使我把办公用品堆放得更加紧凑，过度密集的同事们把我重重包围，导致我到办公室坐下的第一时间想到的居然是什么时候能够下班！<br /><br />由于办公室是新装修的，有人甚至疯传过里面的甲醛含量尚未达标。即使摆放了更多绿色植物，也依然无法改善因为工位缩水，基础设施落后而导致的低落心情。已经听见不止一位同事在抱怨如厕体验不如以前舒适。<br /><br />很多人都就新办公环境的&#8220;用户体验&#8221;达成了一个精炼的公式，我们就是<strong>在网吧里当客服</strong>嘛。<br /><br />作为一个程序员，却被强制转职为&#8220;网吧里的客服&#8221;，我觉得很不爽也很疑惑。我甚至不知道如果微软的Cutler遇上这样的事会不会冲上去殴打他们的CEO（当然如果他们敢这么干的话）。<br /><br />我知道作为一个初出校园，经验不丰富的程序员新手，在大多数情况下能给公司带来的价值是不大的。甚至有人跟我灌输过&#8220;公司请你们进来其实一开始是在亏钱培养的&#8221;之类的观念。某程度上我认为他的观点可以理解，但心里总有种莫名的愤怒。即使一个人创造的价值是如此的微小，但能不能代表他的创造就可以被忽视？<br /><br />我不知道大老板们是不是<strong>不重视程序员所创造的价值</strong>还是干脆<strong>认为公司养了一大批根本没在创造价值的程序员</strong>（新手）。如果他们认同程序员所创造的价值，并希望他们能给公司创造更多价值的话，那为什么给予他们比起以前明显差了那么多的待遇？<br /><br />有位富有经验的同事曾经跟我分享过他的一些观点，他认为：程序员的薪水并不是公司当年的业绩和收入所决定的，而是<strong>社会上同一层次的程序员所能接受的平均薪水决定</strong>的。那样似乎就可以认为，公司赚不赚钱跟那群写代码写到颈椎病、黑眼圈、掉头发甚至爆心脏的程序员没有任何关系。只有市场上存在一位张三他愿意拿80%的薪水去完成100%的工作，那老板们就能心安理得地push李四拿100%的薪水去完成120%的工作甚至更多。如果李四不满而离职，老板们似乎也认为毫无损失。因为解决方案很简单，你不干大把人干，只要把张三招进来就可以了。<br /><br />这么看来，似乎都把老板们描画得十分简单粗暴和不近人情。而且邪恶的形象之下还带着挥之不去的愚蠢。但是想深一层，老板们似乎绝对不可能愚蠢甚至有可能是精明得吓人的。<br /><br />为什么呢？<br /><br />现在资讯如此发达，博客和软文满天飞。减薪、加班和削减福利导致的代码质量下降，人才流失最后带来的效率低下和项目破产，直接增加公司的运营成本，这么简单的道理和现象，那些拿了美帝名校phD学位的老板们怎么可能不知道呢！那既然他们知道，为什么还要反其道而行之呢？<br /><br />现在的状况看起来似乎就是：<strong>我们的大老板明知道降低我们的工作和生活质量会导致公司运营成本的增加，但是他们却无动于衷。</strong>而且对待程序员好一些并不是什么丧心病狂、丧尽天良的事，也有很多国内和国外的公司在这一方面做得非常好。在此就不列举那些福利丧心病狂的公司了。因为一旦举出具体的例子，就一定会有人跳出来发动圣战，说某某一直宣扬自己人工高，福利好的公司其实是无恶不作的绿茶婊；国内很多公司连饭都吃不饱就不应该谈小资情怀云云。<br /><br />但<strong>这又明显地催生出一个新的疑问</strong>：我觉得我所在的公司最近形势一片大好啊，至少在股价和大老板每个季度的财报里都体现出公司蒸蒸日上的势头，那为什么公司赚那么多钱却不租一个好一点的临时办公地点？可能有些人会回答说：因为社会上同一层次的程序员的平均需求下限就是可以到达这么低，所以公司这么干也无可厚非。那我就更疑惑了，既然如此 ，那为什么某些公司在其一个老员工挂掉了之后还给ta的配偶发一半的工资呢？难道这就是传说中的犯贱吗？<br /><br />为什么号称是同一类型的公司，老板们的行为的差异却是如此之大？究竟他们在想什么呢&#8230;&#8230;<br /><br />或者粗鄙地吼一声：对你的员工好一点你会死吗！<br /><br /><br /></div></div><img src ="http://www.cppblog.com/ArthasLee/aggbug/208380.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ArthasLee/" target="_blank">ArthasLee</a> 2014-09-23 00:37 <a href="http://www.cppblog.com/ArthasLee/archive/2014/09/23/208380.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用PS快速找屏幕和窗口像素点的坐标</title><link>http://www.cppblog.com/ArthasLee/archive/2011/07/24/151762.html</link><dc:creator>ArthasLee</dc:creator><author>ArthasLee</author><pubDate>Sun, 24 Jul 2011 14:22:00 GMT</pubDate><guid>http://www.cppblog.com/ArthasLee/archive/2011/07/24/151762.html</guid><wfw:comment>http://www.cppblog.com/ArthasLee/comments/151762.html</wfw:comment><comments>http://www.cppblog.com/ArthasLee/archive/2011/07/24/151762.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ArthasLee/comments/commentRss/151762.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ArthasLee/services/trackbacks/151762.html</trackback:ping><description><![CDATA[<div>在写WG或者一些辅助小工具的过程中，难免会涉及到向窗口的某个控件发送鼠标消息，或者是直接点击窗口或者屏幕上的某一个区域。在资料不充分（例如对方使用的是DirectUI，控件的句柄就很难获得，自然也很难知道某个控件或者对象相对于窗口或者屏幕左上角的坐标值）的情况下，很难确定在发送鼠标消息的时候，鼠标的坐标是多少。那么，如何快速地利用工具作简单的查找呢？<br /><br /><br />笔者在制作一个QQ游戏的辅助工具时，就曾经因为一时间找不到两幅图片相对于窗口左上角的坐标而苦恼。<br />（因为这个找茬辅助工具是基于屏幕截图，像素点之间逐一直接比对的）<img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/arthaslee/2011-07-24-3.jpg" /><br />如何知道上图两个红点分别相对于窗口左上角的坐标值呢？<br />扩展，又如何知道两幅找茬图片的宽度和高度呢？<br /><span style="color: #0000ff">网上不乏好的查找方法，但是为了获取几组值而另外写程序，笔者认为不够灵活。</span><br /><span style="color: #0000ff">程序员还是应该懒一点~</span><br /><br />解决方案如下：<br />运用photoshop的标尺功能即可完成任务：<br />笔者用的是photoshopCS4，估计其他版本也有这个功能。<br /><br />第一步：<br />利用QQ自带的截图功能（TX这回自作聪明了，QQ截图居然可以针对某个特定窗口或者某个特定控件截图，从而省却了全屏截图过后裁切窗口的步骤），截取游戏窗口的PP，如下<img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/arthaslee/2011-07-24-2.jpg" />：<br /><br />第二步，在photoshopCS4中打开这张图片，放大之，然后在工具栏中选择标尺工具，如图：<br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/arthaslee/2011-07-24-4.jpg" /><br />标尺工具<br /><br /><br />接着在图片左上角的位置开始，沿着任意方向拖曳标尺工具，就像平时在windows画图中画直线一样，然后我们会看到一条很细的直线被拖出；<br />笔者往下垂直拖曳，这除了能够确定左上角坐标之外，还可以测量出图片的高度。<img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/arthaslee/2011-07-24-5.jpg" /><br /><span style="color: red"><strong>红色框框</strong></span>里面的灰色线条（两头有十字图案的）就是拖曳出来的直线标尺。<br /><span style="color: #0000ff"><strong>蓝色框框</strong></span>有几组值，熟悉windows窗口编程的童鞋们应该都可以笑而不语了，笔者不才，还是斗胆解说一下：<br /><strong style="color: red">x：相对于图片左上角的像素横坐标</strong>（也就是我们要找的图片或者控件相对于窗口左上角的坐标值）<br /><strong style="color: red">y：相对于图片左上角的像素纵坐标</strong>（同上）<br />w：width，线段两端端点之间的<span style="color: red"><strong>水平宽度</strong></span>（单位是像素）在这里是负数是因为笔者的终点在起点的水平方向左边，因此是负数。<br />h：height，线段两端端点之间的<span style="color: red"><strong>垂直宽度</strong></span>（单位是像素）<br /><br />注意：这里得到的数值是一个小数，其实说白了也是精度问题。<br />平时在做windows窗口编程的<span style="color: #ff0000"><strong>过程中，控件的坐标</strong></span>总是整数，例如上图的x = 9.44，要取9还是取10，那就要看我们在一开始选点的时候是否够贴近真值。<br />这里目测一下（噗！O(&#8745;_&#8745;)O哈哈~），显然是比真实图像稍微偏左了，因此取10，其他值都按照这个方法处理。<br /><br /><br />用这种方法，可以测出两幅图片的左上角坐标和图片的宽、高。获得值之后，运用到程序中，误差不会超过5个像素，到时在测试过程中微调一下就OK了。<br />笔者很幸运，第一次取整的时候就估中了，O(&#8745;_&#8745;)O哈哈~<br /><br />针对QQ游戏大家来找茬，发放一下小屏幕版本的关键数据吧：<br />x1 = 10<br />y1 = 185<br />x2 = 403<br />y2 = 185<br />nWidth = 380<br />nHeight = 285<br /><br /><br />最后恶心一下：祝各位准备YY各种游戏辅助工具的亲们开发愉快，噗哈哈哈哈哈！<br /><br /><strong style="color: #ff0000">谁说只有美工能用PS捏？咱们程序员也可以适当投机取巧一下嘛~哈哈</strong><br /><br /><br /><br /><br /><br /></div><img src ="http://www.cppblog.com/ArthasLee/aggbug/151762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ArthasLee/" target="_blank">ArthasLee</a> 2011-07-24 22:22 <a href="http://www.cppblog.com/ArthasLee/archive/2011/07/24/151762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>双缓冲只能改善图像闪烁问题，而不能彻底消除它</title><link>http://www.cppblog.com/ArthasLee/archive/2011/06/09/148307.html</link><dc:creator>ArthasLee</dc:creator><author>ArthasLee</author><pubDate>Wed, 08 Jun 2011 16:44:00 GMT</pubDate><guid>http://www.cppblog.com/ArthasLee/archive/2011/06/09/148307.html</guid><wfw:comment>http://www.cppblog.com/ArthasLee/comments/148307.html</wfw:comment><comments>http://www.cppblog.com/ArthasLee/archive/2011/06/09/148307.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/ArthasLee/comments/commentRss/148307.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ArthasLee/services/trackbacks/148307.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 2011/6/9今天真是个诡异的日子~哈哈哈哈哈哈哈&nbsp;经过前几天的小试牛刀，已经实现了游戏中的小人在跳来跳去的动画（键盘控制）。不过有个很碍眼的bug，画面闪烁得非常厉害。看到眼到晕了。此物会在绿色block和地面之间跳来跳去~&nbsp;估计大概是我实现的原因，记得以前非礼MFC绘图的时候，想要实现类似动画的效果的话，一般做法是：Set个Timer然后在On...&nbsp;&nbsp;<a href='http://www.cppblog.com/ArthasLee/archive/2011/06/09/148307.html'>阅读全文</a><img src ="http://www.cppblog.com/ArthasLee/aggbug/148307.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ArthasLee/" target="_blank">ArthasLee</a> 2011-06-09 00:44 <a href="http://www.cppblog.com/ArthasLee/archive/2011/06/09/148307.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java学习笔记2——JVM和垃圾回收器</title><link>http://www.cppblog.com/ArthasLee/archive/2011/03/04/141128.html</link><dc:creator>ArthasLee</dc:creator><author>ArthasLee</author><pubDate>Fri, 04 Mar 2011 12:49:00 GMT</pubDate><guid>http://www.cppblog.com/ArthasLee/archive/2011/03/04/141128.html</guid><wfw:comment>http://www.cppblog.com/ArthasLee/comments/141128.html</wfw:comment><comments>http://www.cppblog.com/ArthasLee/archive/2011/03/04/141128.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/ArthasLee/comments/commentRss/141128.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ArthasLee/services/trackbacks/141128.html</trackback:ping><description><![CDATA[&nbsp;
<p><span>Q1</span><span>：为什么程序的数据需要放在堆、栈两个不同（甚至更多）的地方？</span></p>
<p>&nbsp;</p>
<p><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/arthaslee/1.png" width=728 height=366></p>
<p><span>对于堆和栈中的数据内容来说：</span></p>
<p><span>栈：编译器需知道数据内容的生存周期、但是可以快速管理和分配栈内存；</span></p>
<p><span>堆：编译器无需知道数据内容的生存周期，保证灵活性、但是分配和回收内存不如把数据放在栈中来得快；</span></p>
<p>&nbsp;</p>
<p><span>Q2</span><span>：对象在其生命周期结束后经历什么步骤而后被释放？销毁机制具体是怎样的？底层通过什么实现？</span></p>
<p><span>&nbsp;<img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/arthaslee/2.png" width=711 height=120></span></p>
<p>&nbsp;</p>
<p><span>当程序执行到一个块</span><span>or</span><span>作用域（</span><span>scope</span><span>）的结尾，会自动清理其维护的栈中的内存数据。</span></p>
<p><span>于是，如果保存在栈中的唯一</span><span>reference</span><span>挂掉了，就意味着再没有办法可以操作其原先引用的对象了。</span></p>
<p><span>但是保存在堆中的对象在这时候还没有被清理掉。</span></p>
<p>&nbsp;</p>
<p>&nbsp;<img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/arthaslee/3.png" width=756 height=187></p>
<p>&nbsp;</p>
<p><span>对于在堆中，没有被引用的对象。垃圾回收器会直接把他们占据的内存空间释放掉。</span></p>
<p><span>真的如书中所说，这种机制滴水不漏吗？会不会有陷阱？</span></p>
<p><u><span>会不会有一些不经意的操作导致引用计数永远不为零，然而用户却懵然不知呢？</span></u></p>
<p><u><span>内存泄漏真的可以在真正意义上得到避免吗？</span></u></p>
<p>&nbsp;</p>
<p><span>Q3</span><span>：垃圾回收机制究竟能干什么，不能干什么？究竟本质是什么？</span> </p>
<p>&nbsp;</p>
<p>&nbsp;<img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/arthaslee/4.png" width=715 height=224></p>
<p><span>垃圾回收机制原来只会对</span><span>new</span><span>出来的堆内存起作用！！！</span></p>
<p><span>万一不是</span><span>new</span><span>出来的，那还是得人工回收&#8230;&#8230;</span></p>
<p style="FONT-FAMILY: Comic Sans MS; FONT-SIZE: 18pt">1、You might not get garbage collected！</p>
<p><span>哎&#8230;&#8230;这样的垃圾回收机制啊&#8230;&#8230;</span></p>
<p><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/arthaslee/6.png" width=750 height=155></p>
<p><span>还真是懒啊&#8230;&#8230;</span></p>
<p>&nbsp;</p>
<p><span>总之就是，垃圾回收机制只会回收对象在堆中的内存，但究竟这个对象的操作曾经干了什么，有没有&#8220;历史遗留问题&#8221;，</span><span>java</span><span>是一概不管的&#8230;&#8230;</span></p>
<p>&nbsp;<img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/arthaslee/7.png" width=743 height=60></p>
<p>&nbsp;</p>
<p><span>这个垃圾回收机制还是回到回忆中去吧&#8230;&#8230;（我没吐槽最终幻想，真的没有！）</span></p>
<p>&nbsp;<img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/arthaslee/8.png" width=750 height=162></p>
<p>&nbsp;</p>
<p><span>ClassName obj</span><span>；</span><span>//</span><span>局部对象，放在栈中（</span><span>C++</span><span>可以这样，</span><span>java</span><span>不行）</span></p>
<p><span>C++</span><span>的好处：作用域结束，局部对象的</span><span>destructor</span><span>自动被调用，释放栈中内存；</span></p>
<p>&nbsp;</p>
<p><span>New</span><span>出来的对象：</span></p>
<p><span>//C++</span><span>的坏处：不执行</span><span>delete</span><span>的话，对象占用的内存会一直赖在堆中。就让内存漏一会儿吧。</span></p>
<p><span>//java</span><span>的好处：不用显式执行，只要作用域结束，</span><span>reference</span><span>被清除，垃圾回收器就会自动回收堆中的内存；</span></p>
<p><span>而且，</span><span>java</span><span>兄还不让你在栈中创建局部对象呢&#8230;&#8230;</span></p>
<p>&nbsp;</p>
<p><span>Q3/1</span><span>：<u>那究竟</u></span><u><span>new</span></u><u><span>操作发生的时候，</span><span>java</span></u><u><span>语言为用户干了什么？</span><span>new</span></u><u><span>的操作也会对引用计数产生作用——例如初始化和创建吗？</span></u><span>垃圾回收器如何工作呢？</span></p>
<p>&nbsp;</p>
<p><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/arthaslee/9.png" width=731 height=155></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span>相对于堆而言，在栈中释放和分配内存还是效率较高。这可能也是一些程序的数据放在栈中，一些放在堆中的原因之一吧？</span></p>
<p>&nbsp;</p>
<p><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/arthaslee/10.png" width=740 height=282></p>
<p>&nbsp;</p>
<p><span>引用计数类似是一个对象中的成员；有东西引用对象，就增加</span><span>1</span><span>，当有引用在栈中被释放或者设为</span><span>NULL</span><span>，就减少</span><span>1</span><span>；发现引用计数为</span><span>0</span><span>，就证明这个对象已经没人要了&#8230;&#8230;</span></p>
<p><span>缺点：</span></p>
<p><span>垃圾回收器要扫描整个对象列表，查找引用计数为</span><span>0</span><span>的对象；</span></p>
<p><span>如果有两个对象碰巧相互引用了彼此，那这两个对象的引用计数就用不为零，即使没人要也不会被清除掉；</span></p>
<p><span>最悲催的是：</span></p>
<p><span>JVM</span><span>都不是通过这种机制实现垃圾回收滴&#8230;&#8230;</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span>JVM</span><span>是这么干的&#8230;&#8230;</span></p>
<p><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/arthaslee/11.png" width=726 height=214></p>
<p><span>逆向思维，不找死的，找活的！从一个引用出发，遍历其对象</span><span>-</span><span>树（自己作的）。透过每一个在栈中或者在静态区中保存的引用，以之为根节点，遍历由他出发可以到达的对象节点。</span></p>
<p><span>好处：</span></p>
<p><span>不用遍历所有堆中的对象。</span></p>
<p><span>解决两个对象互相引用而导致引用计数恒不为</span><span>0</span><span>的问题；</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span>经过上述处理，没被找到的对象会被清理掉，但是会留下内存碎片，浪费空间。所以&#8230;&#8230;</span></p>
<p><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/arthaslee/12.png" width=742 height=156></p>
<p><span>妙！</span></p>
<p><span>把程序停止下来，把活动的对象</span><span>copy</span><span>到新的堆内存，连续存放，这样就腾出了那些原先成为碎片的空间。</span></p>
<p>&nbsp;</p>
<p><span>然而，一直</span><span>copy</span><span>来</span><span>copy</span><span>去需要有额外的堆内存来保存</span><span>copy</span><span>的数据，实际上</span><span>copy</span><span>发生的时候需要双倍于被</span><span>copy</span><span>内容的堆内存同时可用。</span></p>
<p><span>其次，</span><span>copy</span><span>也需要时空开销&#8230;&#8230;</span></p>
<p><span>于是&#8230;&#8230;</span></p>
<p><span>JVM</span><span>就把</span><span>sweep-and-mark</span><span>和</span><span>stop-and-copy</span><span>结合起来（</span><span>thinking in java</span><span>有详述）</span></p>
<p><span>大对象占用一个</span><span>block</span><span>，每个</span><span>block</span><span>有一个</span><span>generation count</span><span>作为其可用与否的标记。</span></p>
<p><span>一些小对象放在一个</span><span>block</span><span>里；</span></p>
<p><span>根据引用来遍历其对象</span><span>-</span><span>树的操作开始执行：</span></p>
<p><span>一般来说，大对象是不会被</span><span>copy</span><span>的；</span></p>
<p><span>小对象会被复制和重新管理，释放内存碎片；</span></p>
<p><span>JVM</span><span>在碎片多的时候进行</span><span>stop-and-copy</span><span>来整理碎片，腾出空间；在堆内存足够和碎片不多的情况下，则只执行</span><span>sweep-and-mark</span><span>。</span></p>
<p>&nbsp;</p>
<p><span>在这样的垃圾回收机制下，只要是</span><span>new</span><span>出来的东西，真的都能回收了。某程度上还真是滴水不漏啊&#8230;&#8230;</span></p>
<p>&nbsp;</p>
<p><span>显然是抄</span><span>IBM</span><span>大型机的外存管理嘛！数据集放在</span><span>block</span><span>中，被删除的数据集的</span><span>block</span><span>标记为不可用，新建的数据集放在后面的</span><span>block</span><span>中。当存储空间不够了，整理那些已经存在又可用的数据集，存放在一片连续空间中，把碎片重新整理为可用内存，真是&#8230;&#8230;</span></p>
<p><span>抄吧抄吧，不是罪&#8230;&#8230;</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/ArthasLee/aggbug/141128.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ArthasLee/" target="_blank">ArthasLee</a> 2011-03-04 20:49 <a href="http://www.cppblog.com/ArthasLee/archive/2011/03/04/141128.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Crypto++入门学习笔记（DES、AES、RSA、SHA-256）</title><link>http://www.cppblog.com/ArthasLee/archive/2010/12/01/135186.html</link><dc:creator>ArthasLee</dc:creator><author>ArthasLee</author><pubDate>Wed, 01 Dec 2010 12:19:00 GMT</pubDate><guid>http://www.cppblog.com/ArthasLee/archive/2010/12/01/135186.html</guid><wfw:comment>http://www.cppblog.com/ArthasLee/comments/135186.html</wfw:comment><comments>http://www.cppblog.com/ArthasLee/archive/2010/12/01/135186.html#Feedback</comments><slash:comments>29</slash:comments><wfw:commentRss>http://www.cppblog.com/ArthasLee/comments/commentRss/135186.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ArthasLee/services/trackbacks/135186.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 背景（只是个人感想，技术上不对后面的内容构成知识性障碍，可以skip）：最近，基于某些原因和需要，笔者需要去了解一下Crypto++库，然后对一些数据进行一些加密解密的操作。笔者之前没接触过任何加密解密方面的知识（当然，把每个字符的ASCII值加1之流对明文进行加密的&#8220;趣事&#8221;还是干过的，当时还很乐在其中。），甚至一开始连Crypto++的名字都没有听过，被BS了之后...&nbsp;&nbsp;<a href='http://www.cppblog.com/ArthasLee/archive/2010/12/01/135186.html'>阅读全文</a><img src ="http://www.cppblog.com/ArthasLee/aggbug/135186.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ArthasLee/" target="_blank">ArthasLee</a> 2010-12-01 20:19 <a href="http://www.cppblog.com/ArthasLee/archive/2010/12/01/135186.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>QQ美女找茬（外挂）学习笔记（二）图片的比较与显示</title><link>http://www.cppblog.com/ArthasLee/archive/2010/11/24/134432.html</link><dc:creator>ArthasLee</dc:creator><author>ArthasLee</author><pubDate>Tue, 23 Nov 2010 16:02:00 GMT</pubDate><guid>http://www.cppblog.com/ArthasLee/archive/2010/11/24/134432.html</guid><wfw:comment>http://www.cppblog.com/ArthasLee/comments/134432.html</wfw:comment><comments>http://www.cppblog.com/ArthasLee/archive/2010/11/24/134432.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.cppblog.com/ArthasLee/comments/commentRss/134432.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ArthasLee/services/trackbacks/134432.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 续上文：QQ美女找茬（外挂）学习笔记（一）截图的实现与保存http://www.cppblog.com/ArthasLee/archive/2010/11/18/134022.html比较两幅图片的不同过程中，笔者直接用了 == 来比较，尽管XOR会效率高点。以下是笔者的代码，非完全原创，有参考，至于具体URL，在上一篇已经跟大家公布过：&nbsp;1void&nbsp;CZhaoChaV30...&nbsp;&nbsp;<a href='http://www.cppblog.com/ArthasLee/archive/2010/11/24/134432.html'>阅读全文</a><img src ="http://www.cppblog.com/ArthasLee/aggbug/134432.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ArthasLee/" target="_blank">ArthasLee</a> 2010-11-24 00:02 <a href="http://www.cppblog.com/ArthasLee/archive/2010/11/24/134432.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>QQ美女找茬（外挂）学习笔记（一）截图实现与保存</title><link>http://www.cppblog.com/ArthasLee/archive/2010/11/18/134022.html</link><dc:creator>ArthasLee</dc:creator><author>ArthasLee</author><pubDate>Thu, 18 Nov 2010 13:17:00 GMT</pubDate><guid>http://www.cppblog.com/ArthasLee/archive/2010/11/18/134022.html</guid><wfw:comment>http://www.cppblog.com/ArthasLee/comments/134022.html</wfw:comment><comments>http://www.cppblog.com/ArthasLee/archive/2010/11/18/134022.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/ArthasLee/comments/commentRss/134022.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ArthasLee/services/trackbacks/134022.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 关于截图实现的大致原理可参看以下链接：http://student.csdn.net/space.php?uid=110891&amp;do=blog&amp;id=38571第二篇在：http://www.cppblog.com/ArthasLee/archive/2010/11/24/134432.html#FeedBack以下，笔者的文章大部分只是自己的学习体会和总结，并不是非常系统...&nbsp;&nbsp;<a href='http://www.cppblog.com/ArthasLee/archive/2010/11/18/134022.html'>阅读全文</a><img src ="http://www.cppblog.com/ArthasLee/aggbug/134022.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ArthasLee/" target="_blank">ArthasLee</a> 2010-11-18 21:17 <a href="http://www.cppblog.com/ArthasLee/archive/2010/11/18/134022.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>