??xml version="1.0" encoding="utf-8" standalone="yes"?>91久久精品电影,国产精品久久久久久久久鸭,中文精品99久久国产 http://www.shnenglu.com/tyt2008cn/Z忘却的记?/description>zh-cnWed, 07 May 2025 06:50:59 GMTWed, 07 May 2025 06:50:59 GMT60Q{QWin32应用E序的加载与启动分析http://www.shnenglu.com/tyt2008cn/archive/2008/03/07/43898.html微尘微尘Fri, 07 Mar 2008 08:38:00 GMThttp://www.shnenglu.com/tyt2008cn/archive/2008/03/07/43898.htmlhttp://www.shnenglu.com/tyt2008cn/comments/43898.htmlhttp://www.shnenglu.com/tyt2008cn/archive/2008/03/07/43898.html#Feedback0http://www.shnenglu.com/tyt2008cn/comments/commentRss/43898.htmlhttp://www.shnenglu.com/tyt2008cn/services/trackbacks/43898.htmlchenxixia ?Blog

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=455591



设有一个Win32下的可执行文件MyApp.exeQ这是一个Win32应用E序Q符合标准的PE格式。MyApp.exe的主要执行代码都集中在其源文件MyApp.cpp中,该文件第一个被执行的函数是WinMain。初学者会(x)认ؓ(f)E序是首先从这个WinMain函数开始执行,其实不然?

    在WinMain函数被执行之前,有一pd复杂的加载动作,q要执行一大段启动代码。运行程序MyApp.exeӞ操作pȝ的加载程序首先ؓ(f)q程分配一?GB的虚拟地址I间Q然后把E序MyApp.exe所占用的磁盘空间作拟内存映到q个4GB的虚拟地址I间中。一般情况下Q会(x)映射到虚拟地址I间?X00400000的位|。加载一个应用程序的旉比一般h所设想的要,因ؓ(f)加蝲一个PE文gq不是把q个文g整个一ơ性的从磁盘读到内存中Q而是单的做一个内存映,映射一个大文g和映一个小文g所p的时间相差无几。当Ӟ真正执行文g中的代码Ӟ操作pȝq是要把存在于磁盘上的虚拟内存中的代码交换到物理内存(RAM)中。但是,q种交换也不是把整个文g所占用的虚拟地址I间一ơ性的全部从磁盘交换到物理内存中,操作pȝ?x)根据需要和内存占用情况交换一|多页。当Ӟq种交换是双向的Q即存在于物理内存中的一部分当前没有被用的也可能被交换到盘中?/p>

    接着Q系l在内核中创E对象和ȝE对象以?qing)其它内宏V?/p>

    然后操作pȝ的加载程序搜索PE文g中的引入表,加蝲所有应用程序所使用的动态链接库。对动态链接库的加载与对应用程序的加蝲完全cM?/p>

    再接着Q操作系l执行PE文g首部所指定地址处的代码Q开始应用程序主U程的执行。首先被执行的代码ƈ不是MyApp中的WinMain函数Q而是被称为C Runtime startup code的WinMainCRTStartup函数Q该函数是连接时p接程序附加到文gMyApp.exe中的。该函数得到新进E的全部命o(h)行指针和环境变量的指针,完成一些Cq行时全局变量以及(qing)Cq行时内存分配函数的初始化工作。如果用C++~程Q还要执行全局cd象的构造函数。最后,W(xu)inMainCRTStartup函数调用WinMain函数?/p>

   WinMainCRTStartup函数传给WinMain函数?个参数分别ؓ(f)QhInstance、hPrevInstance、lpCmdline、nCmdShow?/p>

    hInstanceQ该q程所对应的应用程序当前实例的句柄。WinMainCRTStartup函数通过调用GetStartupInfo函数获得该参数的倹{该参数实际上是应用E序被加载到q程虚拟地址I间的地址Q通常情况下,对于大多数进E,该参数L0X00400000?/p>

    hPrevInstanceQ应用程序前一实例的句柄。由于Win32应用E序的每一个实例Lq行在自q独立的进E地址I间中,因此Q对于Win32应用E序QW(xu)inMainCRTStartup函数传给该参数的值LNULL。如果应用程序希望知道是否有另一个实例在q行Q可以通过U程同步技术,创徏一个具有唯一名称的互斥量Q通过这个互斥量是否存在可以知道是否有另一个实例在q行?/p>

    lpCmdlineQ命令行参数的指针。该指针指向一个以0l尾的字W串Q该字符串不包括应用E序名?/p>

    nCmdShowQ指定如何显C应用程序窗口。如果该E序通过在资源管理器中双d标运行,W(xu)inMainCRTStartup函数传给该参数的gؓ(f)SW_SHOWNORMAL。如果通过在另一个应用程序中调用CreatProcess函数q行Q该参数由CreatProcess函数的参数l(f)pStartupInfo(STARTUPINFO.wShowWindow)指定?/p>

 



微尘 2008-03-07 16:38 发表评论
]]>
Q{Q深入研I?C++中的 STL Deque 容器http://www.shnenglu.com/tyt2008cn/archive/2008/02/29/43497.html微尘微尘Fri, 29 Feb 2008 14:04:00 GMThttp://www.shnenglu.com/tyt2008cn/archive/2008/02/29/43497.htmlhttp://www.shnenglu.com/tyt2008cn/comments/43497.htmlhttp://www.shnenglu.com/tyt2008cn/archive/2008/02/29/43497.html#Feedback0http://www.shnenglu.com/tyt2008cn/comments/commentRss/43497.htmlhttp://www.shnenglu.com/tyt2008cn/services/trackbacks/43497.html 

 

本文档深入分析了std::dequeQƈ提供了一个指导思想Q当考虑到内存分配和执行性能的时候,使用std::deque要比std::vector好?br>
  介绍

  本文深入地研I了std::deque 容器。本文将讨论在一些情况下使用deque> 比vector更好。读完这文章后读者应该能够理解在定w增长的过E中deque 与vector在内存分配和性能的不同表现。由于deque> 和vector的用法很怼Q读者可以参考vector 文档中介l如何用STL容器?br>
  Deque总览

  deque和vector一样都是标准模板库中的内容Qdeque是双端队列,在接口上和vector非常怼Q在许多操作的地方可以直接替换。假如读者已l能够有效地使用vector容器Q下面提供deque的成员函数和操作Q进行对比参考?br>
  Deque成员函数

函数
描述
c.assign(beg,end)
c.assign(n,elem)
[beg; end)区间中的数据赋值给c?br>n个elem的拷贝赋值给c?/td>
c.at(idx)
传回索引idx所指的数据Q如果idx界Q抛出out_of_range?/td>
c.back()
传回最后一个数据,不检查这个数据是否存在?/td>
c.begin()
传回q代器重的可一个数据?/td>
c.clear()
U除容器中所有数据?/td>
deque<Elem> c
deque<Elem> c1(c2)
Deque<Elem> c(n)
Deque<Elem> c(n, elem)
Deque<Elem> c(beg,end)
c.~deque<Elem>()
创徏一个空的deque?br>复制一个deque?br>创徏一个dequeQ含有n个数据,数据均已~省构造生?br>创徏一个含有n个elem拯的deque?br>创徏一个以[beg;end)区间的deque?br>销毁所有数据,释放内存?/td>
c.empty()
判断容器是否为空?/td>
c.end()
指向q代器中的最后一个数据地址?/td>
c.erase(pos)
c.erase(beg,end)
删除pos位置的数据,传回下一个数据的位置?br>删除[beg,end)区间的数据,传回下一个数据的位置?/td>
c.front()
传回C个数据?/td>
get_allocator
使用构造函数返回一个拷贝?/td>
c.insert(pos,elem)
c.insert(pos,n,elem)
c.insert(pos,beg,end)
在pos位置插入一个elem拯Q传回新数据位置?br>在pos位置插入>n个elem数据。无q回倹{?br>在pos位置插入在[beg,end)区间的数据。无q回倹{?/td>
c.max_size()
q回容器中最大数据的数量?/td>
c.pop_back()
删除最后一个数据?/td>
c.pop_front()
删除头部数据?/td>
c.push_back(elem)
在尾部加入一个数据?/td>
c.push_front(elem)
在头部插入一个数据?/td>
c.rbegin()
传回一个逆向队列的第一个数据?/td>
c.rend()
传回一个逆向队列的最后一个数据的下一个位|?/td>
c.resize(num)
重新指定队列的长度?/td>
c.size()
q回容器中实际数据的个数?/td>
C1.swap(c2)
Swap(c1,c2)
c1和c2元素互换?br>同上操作?/td>

  Deque操作

函数
描述
operator[]
q回容器中指定位|的一个引用?/td>

  上面q些特征和vector明显怼Q所以我们会(x)提出下面的疑问?br>
  问题Q如果deque和vector可以提供相同功能的时候,我们使用哪一个更好呢Q?br>
  回答Q如果你要问的话Q就使用vector吧?br>
  或者你l个解释Q?br>
  非常高兴你这样问Q的,qƈ不是无中生有的,事实上,?a target=_blank>C++标准里解释了q个问题Q下面有一个片断:(x)

  vector在默认情况下是典型的使用序列的方法,对于dequeQ当使用插入删除操作的时候是一个更好的选择?br>
  有趣的是Q本文就是要非常d地理解这句话?br>
  什么是新的Q?/strong>

  l读上面两张表格Q你?x)发现和vector比较q里增加了两个函数?br>
  1、c.push_front(elem) —?在头部插入一个数据?br>
  2、c.pop_front() —?删除头部数据?br>
  调用Ҏ(gu)和c.push_back(elem)和c.pop_back()相同Q这些将来会(x)告诉我们对于deque> ?x)非常有用,deque可以在前后加入数据?gt;

  ~少了什么?

  同时你也?x)发现相对于vector> ~少了两个函敎ͼ你将了解到deque> 不需要它们?br>
  1、capacity()—?q回vector当前的容量?br>
  2、reserve() —?l指定大的vector> 分配I间?br>
  q里是我们真正研I的开始,q里说明deque> 和vector它们在管理内部存储的时候是完全不同的。deque是大块大块地分配内存Q每ơ插入固定数量的数据。vector是就q分配内存(q可能不是一个坏的事情)。但我们应该x是,vector每次增加的内存够大的时候,在当前的内存不够的情c(din)下面的实验来验证deque不需要capacity()和reserve()> 是非常有道理的?br>
  实验一 —?增长的容?/strong>

  目的

  目的是通过实验来观察deque和vector在容量增长的时候有什么不同。用囑Ş来说明它们在分配内存和执行效率上的不同?br>
  描述

  q个实验的测试程序是从一个文件中d文本内容Q每行作Z个数据用push_back插入到deque> 和vector中,通过多次d文g来实现插入大量的数据Q下面这个类是Z试q个内容Q?br>
#include <deque>
#include <fstream>
#include <string>
#include <vector>

static enum modes
{
 FM_INVALID = 0,
 FM_VECTOR,
 FM_DEQUE
};

class CVectorDequeTest
{
 public:
  CVectorDequeTest();
  void ReadTestFile(const char* szFile, int iMode)
  {
   char buff[0xFFFF] = {0};
   std::ifstream inFile;
   inFile.open(szFile);
   while(!inFile.eof())
   {
    inFile.getline(buff, sizeof(buff));
    if(iMode == FM_VECTOR)
     m_vData.push_back(buff);
    else if(iMode == FM_DEQUE)
     m_dData.push_back(buff);
   }
   inFile.close();
  }
  virtual ~CVectorDequeTest();
 protected:
  std::vector<std::string> m_vData;
  std::deque<std::string> m_dData;
};


  l果

  试E序q行的^台和一些条Ӟ(x)

CPU 1.8 GHz Pentium 4
内存 1.50 GB
操作pȝ W2K-SP4
文g中的行数 9874
q_每行字母个数
1755.85
L件的ơ数
45
d插入的数据个?/td> 444330


  使用Windowsd理器来记录执行效率Q本E序中用了Laurent Guinnard 的CDurationcR消耗系l资源如下图Q?br>

  注意在vector分配内存的最高峰Qvector在分配内存的时候是怎样辑ֈ最高|deque是q样的,它在插入数据的同Ӟ内存直线增长Q首先deque的这U内存分配单元进行回收的话,存在意想不到的后果,我们希望它的分配内存看上dvector一P通过上面的测试我们需要进一步的试Q现提出一个假设:(x)假设deque分配的内存不是连l的Q一定需要释攑֒收回内存Q我们将q些假设加入后面的测试中Q但是首先让我们从执行的性能外表分析一下这个实验?br>
  I竟分配内存需要消耗多久?

  注意看下面这张图片,vector在不插入数据的时候在q行L分配更多内存?br>

  同时我们也注意到使用push_back插入一l数据消耗的旉Q注意,在这里每插入一l数据代表着9874个串Q^均每个串的长度是1755.85?br>

 

实验二—?vector::reserve()的资?/strong>

  目的

  q个实验的目的是vector在加入大量数据之前调用reserve()Q和dequeq行比较Q看它们的内存分配和执行效率怎么P

  描述

  本实验中的测试基本上和实验一相同Q除了在试cȝ构造函C加入下面q行代码:

m_vData.reserve(1000000);

  l果

  试E序q行的^台和一些条Ӟ(x)

CPU
1.8 GHz Pentium 4
内存
1.50 GB
操作pȝ
W2K-SP4
文g中的行数
9874
q_每行字母个数
1755.85
L件的ơ数
70
d插入的数据个?br> 691180

  使用Windowsd理器来记录执行效率Q本E序中用了>Laurent Guinnard 的CDurationcR消耗系l资源如下图Q?br>

  我们注意到vector不在需要分配花费多余的旉分配内存了,q是׃我们使用了reserve()对于所试?gt;691180个数据ؓ(f)我们每一ơ插入大量数据的时候保留了_的内存空_(d)对于deque存储分配的假设,观察q个试中的内存分配囑Ş和上一个图形,我们需要进一步量化这个测试?br>
  怎样改良内存分配的性能呢?

  下面q个图例说明随着数据的增加,定w在增加:(x)


  当增加数据的时候对定w的增加在vector和deque执行效率基本一P然而,vector在插入数据的时候有一些零星的旉消耗,看下面的图例Q?br>

  通过l计分析vector和deque在插入^均ؓ(f)>1755.85长度?gt;9874个数据所p的时_(d)下面是ȝ的表|(x)


Vector

Deque

Mean

0.603724814 sec

Maximum

0.738313000 sec

Minimum

0.559959000 sec


Std. Dev

0.037795736 sec

6-Sigma

0.226774416 sec

Mean

0.588021114 sec

Maximum

0.615617000 sec

Minimum

0.567503000 sec

Std. Dev

0.009907800 sec

6-Sigma

0.059446800 sec


  实验三——内存回?/strong>

  目的

  本实验是对假设deque分配的内存不是(f)q的Q而且很难回收q行量化试分析?br>
  描述

  在本实验中再ơ用C实验一中的代码Q在调用函数中加入记录增加数据执行的效率具体入下面操作:(x)

for(xRun=0; xRun<NUMBER_OF_XRUNS; xRun++)
{
 df = new CVectorDequeTest;
 elapsed_time = 0;

 for(i=0; i<NUMBER_OF_RUNS*xRun; i++)
 {
  cout << "Deque - Run " << i << " of " <<
  NUMBER_OF_RUNS*xRun << "... ";
  df->ReadTestFile("F:\\huge.csv",DF_DEQUE);
  deque_data.push_back(datapoint());
  deque_data.back().time_to_read = df->GetProcessTime();
  elapsed_time += deque_data.back().time_to_read;
  deque_data.back().elapsed_time = elapsed_time;
  cout << deque_data.back().time_to_read << " seconds\n";
 }
 vnElements.push_back(df->GetDequeSize());
 cout << "\n\nDeleting... ";
 del_deque.Start();
 delete df;
 del_deque.Stop();
 cout << del_deque.GetDuration()/1000000.0 << " seconds.\n\n";
 vTimeToDelete.push_back(del_deque.GetDuration()/1000000.0);
}

  l果

  本测试和上面两个实验在相同的q_上运行,除了插入的数据由>9874?gt;691180Q需要插?gt;70ơ,下面图例昄?gt;deque在插入数据的时候分配内存的情况Q在deque里插入了q_每个长度?gt;1755.85的字W串?gt;


  管从几个曲U图中看到的实际消耗时间不同,但些曲线N_C>R2=95.15%。所l的数据炚w实际背离了下表中l计的曲U图数据:

deque Results

Mean

0.007089269 sec

Maximum

11.02838496 sec

Minimum

-15.25901667 sec

Std. Dev

3.3803636 sec

6-Sigma

20.2821816 sec

  在相同的情况下比较vector的结果是非常有意义的。下面图是vector和deque在相同的情况下分配内存消耗的旉比较图:(x)


  q些数据在这个测试中?gt;R2=82.12%。这或许可以l过每个点反复运行得到更加优化,在这个问题中q些数据适当地标注了q些点,所l的数据炚w实际背离了下表中l计的曲U图数据:


vector Results

Mean

-0.007122715sec

Maximum

0.283452127 sec

Minimum

-0.26724459sec

Std. Dev

0.144572356sec

6-Sigma

0.867434136sec


实验四—?vector::insert() ?deque::insert() 执行特点比较

  目的

  dequed使用参数为常量的insert()。但怎么栯和vector::insert()比较一下呢Q本实验的目的就是比较一下vector::insert()> ?deque::insert()的工作特炏V?

  描述

  在容器的容器多次插入数据Q在q里可能不符合你的需求,既然q样你可以用insert()Q试验代码也和实验一基本一P使用insert()代替push_back()Q用insert(>)来测试?br>
  l果

  当插入常量给deque的时候,从下囑֏以看出和vector的对比来?br>

  注意两张囄中时间u的不同,q是?gt;61810个数据插入到容器中?br>

  实验五——读取容器的性能

  目的

  q个实验测试vector::at(),vector::operator[],deque::at()和deque::operator[]的性能。首先应该是operator[]比atQ)效率要高Q因为它不进行边界检查,同时也比较vector和deque?br>
  描述

  q个实验测试中的容器有1000000个类型ؓ(f)std::stringQ每个字W串长度?024的数据,分别使用at()和operator[]q两个操作来讉K容器容器的数据,试它们q行的时_(d)q个试执行50ơ,l计每次执行的结果?br>
  l果

  我们看到使用vector和deque讉K容器中的数据Q他们执行的性能差别很小Q用operator[]和at()讉K数据的性能差别几乎可以忽略不计Q下面是l计的结果:(x)


vector::at()

Mean

1.177088125sec

Maximum

1.189580000sec

Minimum

1.168340000sec

Std. Dev

0.006495193sec

6-Sigma

0.038971158sec

deque::at()

Mean

1.182364375sec

Maximum

1.226860000sec

Minimum

1.161270000sec

Std. Dev

0.016362148sec

6-Sigma

0.098172888sec

vector::operator[]

Mean

1.164221042sec

Maximum

1.192550000sec

Minimum

1.155690000sec

Std. Dev

0.007698520sec

6-Sigma

0.046191120sec

deque::operator[]

Mean

1.181507292sec

Maximum

1.218540000 sec

Minimum

1.162710000sec

Std. Dev

0.010275712sec

6-Sigma

0.061654272sec

  l论

  在这文章中我们覆盖了多U不同的情况来选择我们到底是该使用vectorq是deque。让我们ȝ一下测试的l果看下面几个结论?br>
  当执行大数据量的调用push_back()的时候,C要调用vector::reserve()?br>
  在实验一中我们研I了vector和deque在插入数据的情况。通过q些假设Q我们可以看出deque分配的空间是预先分配好的Qdequel持一个固定增长率Q在vector实验中我们考虑到应该调用vecor::reserve()>.然后在下面这个例子验证了我们的假设,在用vector的时候调用reserve()能够膀子我们预先分配空_(d)q将是vector一个默认选择的操作?br>
  当你分配很多内存单元的时候,C使用deque回收内存要比vector消耗时间多?br>
  在实验三中我们探讨了vector和deque在回攉L内存块上的不同,分别证明了vector在分配内存的时候是U性增长,而deque是指数增长,同样Qvector要回收的内存比deque多的多,如果你@环调用了push_back()Q那么deque获取大量的内存Q而且是(f)q的。我们通过试发现在分配内存单元消耗的旉和vector的时间接q?br>
  如果你计划用insert()Q或者需要pop_front()Q那׃用deque?br>
  ׃vector没有提供pop_front()函数Q但在实验四的结果中可以看出没有insert()是非常好的,同时也告诉我们ؓ(f)什么deque在STLcM要作为单独的一个类划分出来?br>
  对于讉K数据Qvector::at()效率最高?br>
  在实验五中统计的数据表示Q所有访问数据方法的效率是非常接q的Q但是vector::at()效率最高。这是因为最优的q图访问时间ؓ(f)最低的六个西格玛倹{?br>
  最?/strong>

  我希望本文能够带你认识dequeQ而且对它感兴或者一个启发,Ƣ迎l箋讨论关于vector和dequeM问题和内宏V?

微尘 2008-02-29 22:04 发表评论
]]>
也谈 extern "C" 的用?/title><link>http://www.shnenglu.com/tyt2008cn/archive/2008/02/25/43231.html</link><dc:creator>微尘</dc:creator><author>微尘</author><pubDate>Mon, 25 Feb 2008 12:46:00 GMT</pubDate><guid>http://www.shnenglu.com/tyt2008cn/archive/2008/02/25/43231.html</guid><wfw:comment>http://www.shnenglu.com/tyt2008cn/comments/43231.html</wfw:comment><comments>http://www.shnenglu.com/tyt2008cn/archive/2008/02/25/43231.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/tyt2008cn/comments/commentRss/43231.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/tyt2008cn/services/trackbacks/43231.html</trackback:ping><description><![CDATA[ <br>       怿大家在编码中Q有时会(x)见到某某函数前面加了 extern "C" 的关键字修饰Q尤其在模块(Dll)提供的头文g中。但是否很清楚的了解它的作用Q?我当时第一ơ碰到时Q其实是懂非懂的^_^。查了些资料Q才明白其用法,详细如下?br><br>      1. 首先说下~译器编译函数时Q对函数名的处理?br>         在C语言中,对函数如: IRoleView* RoleViewCreate(int nType); ~译后生成的函数名是RoleViewCreate<br>         但是在C++中,׃存在函数重蝲的特性,所以编译时C++~译器会(x)Ҏ(gu)参数、返回值等信息对函数名改编Q如上面函数在C++~译器中生成的函数名?<a href="mailto:?RoleViewCreate@@YAPAVIRoleView@@H@z">?RoleViewCreate@@YAPAVIRoleView@@H@z</a><br>      <br>     2. extern "C"的含义?br>         extern "C" 有两重含义:(x)<br>        其一Q被修饰的变量或函数是extern的存储类型,它告诉编译器Q其声明的变量或函数可以被本模块和外部某块用?br>        其二Q被其修饰的函数或变量是按照C语言的方式来~译和链接的?br>        注意Qextern "C"写法 只在C++中被支持QC语言不支持该写法?br>   <br>    3. extern "C"的两U惯用用法:(x)<br>        a) 在C++中用C语言的函数或变量Q在包含C语言提供的头文g是,需要用 extern "C" { } 来包含头文g。如下:(x)<br>           extern "C"<br>          {<br>               #include "lua.h"    //lua.h是C~写Qƈ提供的头文g<br>          }<br>        q里引用下第1点的函数来说明上q写法的用途:(x)假设lua.h中包含函?IRoleView* RoleViewCreate(int nType), 那么C语言的编译时生成的函数名是RoleViewCreateQ而当C++客户E序M用它Ӟ默认是按C++的链接方式(即不加以上的 extern "C"ӞQ所以C++客户E序?x)去外部模块中查扑և数名?br><a href="mailto:?RoleViewCreate@@YAPAVIRoleView@@H@z">?RoleViewCreate@@YAPAVIRoleView@@H@z</a>的函敎ͼq样C++~译器会(x)找不到该函数Q报?无法解析的外部标识符"的错误; 而当加上 <br>extern "C" { } Ӟ它就告诉~译器头文g中包含的函数或变量要按照C语言的编译链接方式进行,所以C++~译器会(x)d部模块查扑և数名?br>RoleViewCreate的函敎ͼ从而得到正结果?br><br>      b) 在C中调用一个C++语言中的函数或变量时QC++的头文g需要添?extern "C"Q这是ؓ(f)了让~译器对函数或变量按C语言的方式进行编译,已供C语言调用Q?但在C语言中,不能直接包含声明了extern "C"的头文gQ而应该在C文g中把在C++头文件中定义的函敎ͼ声明?externcdQ因为在C语言中,q不支持extern "C"的写法;<br><br>参考资料:(x)《C++中extern "C" 含义深层探烦》作者:(x)宋宝?br>                    《C++ Primer?br>         <img src ="http://www.shnenglu.com/tyt2008cn/aggbug/43231.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/tyt2008cn/" target="_blank">微尘</a> 2008-02-25 20:46 <a href="http://www.shnenglu.com/tyt2008cn/archive/2008/02/25/43231.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.dnf530.cn" target="_blank">þ99Ʒһ</a>| <a href="http://www.laqn.cn" target="_blank">þþƷĻһ</a>| <a href="http://www.vtdf.cn" target="_blank">ŷ㽶þۺվ</a>| <a href="http://www.iomg.com.cn" target="_blank">99þѹۺϾƷ</a>| <a href="http://www.icq418.cn" target="_blank">ӰһѾþþþþþþ </a>| <a href="http://www.thenorthface.net.cn" target="_blank">þùֱ</a>| <a href="http://www.lozhun.cn" target="_blank">ҹƷþþþþ99</a>| <a href="http://www.task5.cn" target="_blank">99þþžžƷ</a>| <a href="http://www.uyfw.cn" target="_blank">޹Ʒþ</a>| <a href="http://www.vbpt.cn" target="_blank">þ޸ۺ</a>| <a href="http://www.xoci.cn" target="_blank">ɫۺϾþۺ</a>| <a href="http://www.lvtonggaoerfu.cn" target="_blank">þþþþþòҰ¸߳ </a>| <a href="http://www.fqvb.cn" target="_blank">91ƷۺϾþ㽶 </a>| <a href="http://www.aion66.cn" target="_blank">ƷþþĻһ</a>| <a href="http://www.fmlw.net.cn" target="_blank">þAV߳AVAV</a>| <a href="http://www.mxcqsf.cn" target="_blank">þþƷWWW456C0M</a>| <a href="http://www.xiaoxyl.cn" target="_blank">þùƷһƷ</a>| <a href="http://www.hbxdh.cn" target="_blank">㽶99þùۺϾƷլ </a>| <a href="http://www.aisile.com.cn" target="_blank">þþþ</a>| <a href="http://www.zhoupeng520.cn" target="_blank">˾Ʒþ</a>| <a href="http://www.dyssnv.cn" target="_blank">þZYZԴվĶ</a>| <a href="http://www.4000261688.cn" target="_blank">þþþۺĻ</a>| <a href="http://www.sangaotang.cn" target="_blank">þùƷ99Ʒ987</a>| <a href="http://www.csmfy.cn" target="_blank">žžƷ99þþ㽶</a>| <a href="http://www.jire1z.cn" target="_blank">þĻ˿</a>| <a href="http://www.sowudi.com.cn" target="_blank">ŷ޾þþþƷ</a>| <a href="http://www.juruse.com.cn" target="_blank">þþþӰԺС</a>| <a href="http://www.qkl888.cn" target="_blank">һֻƴƬ99þ</a>| <a href="http://www.e9920.cn" target="_blank">þþþavר</a>| <a href="http://www.reducki.cn" target="_blank">޾Ʒþþþϼ</a>| <a href="http://www.xmqsgm.cn" target="_blank">鶹avþavʢav</a>| <a href="http://www.sskca.cn" target="_blank">þ91Ʒ91</a>| <a href="http://www.yutobe.cn" target="_blank">Ļþһ</a>| <a href="http://www.tongshenghu.com.cn" target="_blank">þ¶Ʒ</a>| <a href="http://www.yrjiameng.cn" target="_blank">þù</a>| <a href="http://www.tjjobs.com.cn" target="_blank">Ʒþþþþ</a>| <a href="http://www.mhlz4f.cn" target="_blank">ƷŷƬþùŷ...</a>| <a href="http://www.17wgame.cn" target="_blank">þ¾Ʒ</a>| <a href="http://www.dicy888.cn" target="_blank">Ʒ99þþƷ</a>| <a href="http://www.0352quan.cn" target="_blank">þþƷƷƾ</a>| <a href="http://www.todouba.cn" target="_blank">þþþһƷ޹ۺAV </a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>