<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>自由的锁链</title>
    <description>c++/c#/java</description>
    <link>http://jimmy-c.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>32 位和 64 位版本的 Windows 比较的内存和 CPU 限制</title>
        <author>jimmy_c</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jimmy-c.javaeye.com">jimmy_c</a>&nbsp;
          链接：<a href="http://jimmy-c.javaeye.com/blog/184114" style="color:red;">http://jimmy-c.javaeye.com/blog/184114</a>&nbsp;
          发表时间: 2008年04月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://support.microsoft.com/kb/889654" target="_blank">http://support.microsoft.com/kb/889654</a>
          <br/>
          <span style="color:red;">
            <a href="http://jimmy-c.javaeye.com/blog/184114#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 18 Apr 2008 15:07:59 +0800</pubDate>
        <link>http://jimmy-c.javaeye.com/blog/184114</link>
        <guid>http://jimmy-c.javaeye.com/blog/184114</guid>
      </item>
      <item>
        <title>greta在vc express 2008下编译失败</title>
        <author>jimmy_c</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jimmy-c.javaeye.com">jimmy_c</a>&nbsp;
          链接：<a href="http://jimmy-c.javaeye.com/blog/182985" style="color:red;">http://jimmy-c.javaeye.com/blog/182985</a>&nbsp;
          发表时间: 2008年04月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          支持vc6和vs.net。在2008下产生C2923。<br />似乎是原有hetero_stack::stack_node::header结构现在不能看作类型了。<br /><br />将原有code<br /><pre name="code" class="c++">
struct stack_node
{
    struct header
    {
        stack_node * m_back;
        stack_node * m_next;
        byte_t     * m_current; // ptr into m_mem. alloc from here
        byte_t     * m_end;     // ptr to last+1 byte_t in m_mem
    };

    union
    {
        header  m_head;
        byte_t  m_align[ aligned_sizeof&lt;header>::no_rtti ];
    };

    // This is the buffer into which values will be pushed and popped.
    // It is guaranteed to meet the AlignmentT requirements because of
    // the union above.
    byte_t  m_mem[1];

    size_t size() const // throw()
    {
        return static_cast&lt;size_t>( m_head.m_end - m_mem );
    }
};
</pre><br />改为<br /><pre name="code" class="c++">
struct stack_node_header;

struct stack_node
{
    union
    {
        stack_node_header  m_head;
        byte_t  m_align[ aligned_sizeof&lt;stack_node_header>::no_rtti ];
    };

    // This is the buffer into which values will be pushed and popped.
    // It is guaranteed to meet the AlignmentT requirements because of
    // the union above.
    byte_t  m_mem[1];

    size_t size() const // throw()
    {
        return static_cast&lt;size_t>( m_head.m_end - m_mem );
    }
};

struct stack_node_header
{
    stack_node * m_back;
    stack_node * m_next;
    byte_t     * m_current; // ptr into m_mem. alloc from here
    byte_t     * m_end;     // ptr to last+1 byte_t in m_mem
};
</pre><br />并将引用：<br /><pre name="code" class="c++">byte_t      m_buf[ aligned_sizeof&lt;stack_node::header>::no_rtti + StaticBlockSizeT ];</pre><br />改为：<br /><pre name="code" class="c++">byte_t      m_buf[ aligned_sizeof&lt;stack_node_header>::no_rtti + StaticBlockSizeT ];</pre><br />编译通过。
          <br/>
          <span style="color:red;">
            <a href="http://jimmy-c.javaeye.com/blog/182985#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 15 Apr 2008 17:49:01 +0800</pubDate>
        <link>http://jimmy-c.javaeye.com/blog/182985</link>
        <guid>http://jimmy-c.javaeye.com/blog/182985</guid>
      </item>
      <item>
        <title>编程风格偶感</title>
        <author>jimmy_c</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jimmy-c.javaeye.com">jimmy_c</a>&nbsp;
          链接：<a href="http://jimmy-c.javaeye.com/blog/181532" style="color:red;">http://jimmy-c.javaeye.com/blog/181532</a>&nbsp;
          发表时间: 2008年04月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          基础知识：<br />c++和c是一种完全不同的语言。c以小取胜，c++以多范性编程而著称。<br /><br />c++的范型可以包括：<br />c一样的面向过程编程；<br />宏语言；<br />c with class；<br />oo；<br />template；<br />GP。<br /><br />这中间，我认为宏是一种可以称作范型的东西，因为这方面的高手完全可以用它来创造出属于自己的子语言来。<br />应该把简单目的的template编程（泛型？此泛型非彼范型）和GP分开，他们的编程目标是截然不同的。<br /><br />最早受MFC影响很深。感觉自己最初的进步始于MFC源码的阅读（VC4.0了）。所以当时写程序的风格也是类MFC的，我的定义就是OO + 宏。其实也很好，很强大。<br /><br />中间做了两年java，这期间学习了GP，两种完全不同风格的编程模式冲击下，渐渐放弃了MFC的手法。<br /><br />但是OO + GP的开发偶觉得很痛苦，所以虽然不断地尝试，但并没有持续很久。原因一个字：累！<br /><br />OO最大的缺点我认为是侵入式的。用c写程序，lib也好，dll也好，一般只要一个简单不过的头文件就好了。而C++和Java呢，拔出萝卜带着泥，哩哩罗罗一堆类，通常缺了谁也不行。<br /><br />OO的原始目的/优点是什么呢？封装呗！可这样还不如c的模块封装性，实在是难以令人苟同。<br />带来的恶果是很明显的。OO的工程，尤其是C++，我们精心维护的工程，很容易被一两个水平不够的孩子改的面目全非。编译不过了，这儿加个头文件；程序运行遇到了框架的束缚，改就一个字！java的情况也好不到哪儿去。所以broken window的理论被发明了，说白就是：谨慎谨慎再谨慎！珍惜珍惜再珍惜！<br />解决这种状况的方法大概只有一种，就是给OO的模块加上一个面向过程的壳子。我们可以美其名曰：Facade。MS发明的COM+接口在这里也能凑活用上。不过这样的壳子对于程序本身，总像是身外之物。因为他们和真正的Facade和COM+的初衷是不一致的。孟岩老大给这种状况起了一个好听的名字，叫做：用C做接口，用C++编程！<br /><br />GP是一种很奇特的技术。我不是科班出身，所有的技术大多从编码中得来。虽然好读书，但是有点儿不求甚解，经常会搞错个名词什么的，思想上也很难达到深刻。不过当我第一次看到《深入C++模型》、《设计模式》、《重构》、《敏捷开发》时，里面的东西都有似曾相识的感觉：原来如此！这不就是我一直研究的XXX问题么？<br />然而GP的概念最初我是从书本中得来的。两本书给了我很大的启发作用：《C++设计新思维》和《产生式编程——方法、工具和应用》。它给我的感觉是震撼性的，焕然一新的：原来C++还可以这样想，这样用！然后基于它作了很多实践。但是真实的感受却是：理想和实际相差得很远。<br />GP的技术难度我就不说了。多数人认为是GP的技术门槛太高，限制了它的使用。我不这样认为。如果一个技术真的能够带来很高的劳动生产率，那么即使它的难度很大，也不会真正阻止它的流行。而对于有创造力和求知欲的程序员来说，“技术难度”一词很难说是褒义还是贬义，也许更可能因此成为大家追捧的对象。<br />所以，GP之所以未流行起来，应该只能是基于以下两种可能：<br />1. 目前的市场没有符合这种技术的强有力的需求（不妨碍这种技术今后在某一时刻会忽然流行起来）；<br />2. （由于某种限制，或者自身缺陷）这种技术并未带来真正的、实际的、比其它技术更高的劳动生产率水平。<br />说到这儿我要暂停一下。我所说GP技术未流行起来，并不是否定或者无视诸如STL，boost之类的模板库的广泛应用。我所指的，是深入C++项目的GP思想的应用，至少目前是不存在的。<br />那么，原因何在呢？<br /><br />&lt;未完待续>
          <br/>
          <span style="color:red;">
            <a href="http://jimmy-c.javaeye.com/blog/181532#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 11 Apr 2008 06:42:59 +0800</pubDate>
        <link>http://jimmy-c.javaeye.com/blog/181532</link>
        <guid>http://jimmy-c.javaeye.com/blog/181532</guid>
      </item>
      <item>
        <title>DataProxy实现</title>
        <author>jimmy_c</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jimmy-c.javaeye.com">jimmy_c</a>&nbsp;
          链接：<a href="http://jimmy-c.javaeye.com/blog/137968" style="color:red;">http://jimmy-c.javaeye.com/blog/137968</a>&nbsp;
          发表时间: 2007年11月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          写了一个小东西，用于实现DataProxy机制，暂时还处于试验阶段：<br /><br /><pre name="code" class="java">

class TestDataObjectDeclaration : public Test
{
public:
	TestDataObjectDeclaration();

public:
	virtual bool RunTest();
};

const int DEFAULT_VALUE_OF_BASE_X = 4;
const int DEFAULT_VALUE_OF_X = 5;

class MyBaseObject
{
public:
	MyBaseObject() : _x(DEFAULT_VALUE_OF_BASE_X)
	{}
public:
	int _x;
};

class MyDataObject : public MyBaseObject, public archer::oi::DataObject&lt;MyDataObject, MyActionProxy>
{
public:
	MyDataObject() : _x(DEFAULT_VALUE_OF_X)
	{}
public:
	int _x;

public:
	const type_info& func()
	{ return ((const archer::oi::rtti_derived_class&lt;MyDataObject>&) this->GetRuntimeTypeInfo()).typeidof(); }
};

DECLARE_RTTI(MyDataObject)
	DECLARE_SIMPLE_RTTI_ITEM_OF_BASE(MyDataObject, MyBaseObject, _x, int, 0, "b_x")
	DECLARE_SIMPLE_RTTI_ITEM(MyDataObject, _x, int, 1, "x")
END_DECLARE_RTTI

TestDataObjectDeclaration::TestDataObjectDeclaration() : Test("testDataObjectDeclaration") {}

bool TestDataObjectDeclaration::RunTest()
{
	MyDataObject obj = MyDataObject();

	char buffer[256];
	sprintf(buffer, "size of MyDataObject: [%d]", sizeof(MyDataObject));
	this->PromptMessage(buffer);

	if (!AssertEquals(std::string(obj.func().name()), std::string("class MyDataObject"), "Get wrong type id from rtti."))
		return false;

	if (!AssertEquals(DEFAULT_VALUE_OF_X, obj.GetData&lt;int>(1), "Failed to get data by rtti."))
		return false;

	if (!AssertEquals(DEFAULT_VALUE_OF_BASE_X, obj.GetData&lt;int>(0), "Failed to get data of base class by rtti."))
		return false;

	const int CHANGED_VALUE = 10;
	obj.SetData&lt;int>(1, CHANGED_VALUE);
	obj.SetData&lt;int>(0, CHANGED_VALUE);

	if (!AssertEquals(CHANGED_VALUE, obj.GetData&lt;int>(1), "Failed to set data by rtti."))
		return false;

	if (!AssertEquals(CHANGED_VALUE, obj.GetData&lt;int>(0), "Failed to set data of base class by rtti."))
		return false;

	return true;
}

</pre><br /><br />优点是用户类MyDataObject的代码侵入很少，DataObject类可以用于多继承。data member的调用已经很类似于script语言了，GetData,SetData还可以按name查找。<br />缺点是data member必须为public，以及类似script语言的效率低的问题。目前rtti中，data member的声明是放在一个列表里，每次GetData, SetData时需要对列表遍历。还没有想到什么改进的办法，hash表当然是可以的，弄两个hash表把每个rtti_item存起来。但更希望有template直接的解法。<br /><br />==============================================================================<br /><br />早上起来花了点时间，把上面提的关于效率问题的功能实现了。现在<br />GetData和SetData分别变成了<br />GetData&lt;0, int>();<br />和SetData&lt;0, int>(CHANGED_VALUE);<br />而用name做index似乎是无法模板化的。所以name的list查找机制依旧保留。
          <br/>
          <span style="color:red;">
            <a href="http://jimmy-c.javaeye.com/blog/137968#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 05 Nov 2007 05:39:07 +0800</pubDate>
        <link>http://jimmy-c.javaeye.com/blog/137968</link>
        <guid>http://jimmy-c.javaeye.com/blog/137968</guid>
      </item>
      <item>
        <title>衰落中的C++</title>
        <author>jimmy_c</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jimmy-c.javaeye.com">jimmy_c</a>&nbsp;
          链接：<a href="http://jimmy-c.javaeye.com/blog/129129" style="color:red;">http://jimmy-c.javaeye.com/blog/129129</a>&nbsp;
          发表时间: 2007年10月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>不知不觉之中时间过了几年，忽然发觉C/C++在程序员中的地位已经大不如前了。搜索一下SourceForge，发现现在java和C#的项目当真不少，而C++的项目叫得出名的似乎还是原来那些老帮菜，没有多少新意。</p>
<p>这几天公司面试程序员，我出了几道c/c++的试题。说实话，我是非常不喜欢在面试时给人出太详细的笔试题的，但是因为招的人有c++的要求，就挑了几个我个人认为非常基础的问题考了一下，结果让人很吃惊，很多自称&ldquo;精通C++&rdquo;的孩子，居然连最简单的问题也会答错，不少还是清华出来的有工作经验的本科生，硕士生。贴出来让大家看看，是不是我的要求太高了。</p>
<p><span style="font-family: Arial;">1. 声明一个函数指针<br />
2. int (*A)[];和<br />
&nbsp;&nbsp; int *A [] 有何不同？<br />
3. C++中，struct是否可以有构造/析构函数？struct和class有何不同？<br />
4. 声明一个模板类<br />
5. #include &lt;stdio.h&gt;<br />
&nbsp;&nbsp; class A<br />
&nbsp;&nbsp; {<br />
&nbsp;&nbsp; public:<br />
&nbsp;&nbsp;&nbsp;&nbsp; void Func() { printf(&quot;A\n&quot;); }<br />
&nbsp;&nbsp; };</span>
</p>
<p><span style="font-family: Arial;">&nbsp;&nbsp; class B : public A<br />
&nbsp;&nbsp; {<br />
&nbsp;&nbsp; public:<br />
&nbsp;&nbsp;&nbsp;&nbsp; void Func() { printf(&quot;B\n&quot;); }<br />
&nbsp;&nbsp; };</span>
</p>
<p><span style="font-family: Arial;">&nbsp;&nbsp; int main()<br />
&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A* a = new B();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a-&gt;Func();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete a;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br />
&nbsp;&nbsp; }<br />
6. 什么是虚函数表？<br />
7. 写一个简单的递归函数计算N!<br />
&nbsp;&nbsp; int Factorial(int n)<br />
&nbsp;&nbsp; {<br />
&nbsp;&nbsp; }</span>
</p>
<p><span style="font-family: Arial;">&nbsp;&nbsp; int main()<br />
&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp; int n; <br />
&nbsp;&nbsp;&nbsp;&nbsp; cin &gt;&gt; n;<br />
&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;N!=%d\n&quot;, Factorial(n));<br />
&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br />
&nbsp;&nbsp; }</span>
</p>
<p><span style="font-family: Arial;">8. 解释关键字：volatile; const<br />
</span>
</p>
          <br/>
          <span style="color:red;">
            <a href="http://jimmy-c.javaeye.com/blog/129129#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 04 Oct 2007 22:33:31 +0800</pubDate>
        <link>http://jimmy-c.javaeye.com/blog/129129</link>
        <guid>http://jimmy-c.javaeye.com/blog/129129</guid>
      </item>
  </channel>
</rss>