??xml version="1.0" encoding="utf-8" standalone="yes"?>久久九九兔免费精品6,国产精品一区二区久久不卡,久久777国产线看观看精品http://www.shnenglu.com/aa19870406/category/16145.htmlzh-cnThu, 12 Jul 2012 10:52:01 GMTThu, 12 Jul 2012 10:52:01 GMT60linux 文g操作之closehttp://www.shnenglu.com/aa19870406/archive/2012/07/12/183010.htmlMrRightLeftMrRightLeftThu, 12 Jul 2012 08:13:00 GMThttp://www.shnenglu.com/aa19870406/archive/2012/07/12/183010.htmlhttp://www.shnenglu.com/aa19870406/comments/183010.htmlhttp://www.shnenglu.com/aa19870406/archive/2012/07/12/183010.html#Feedback0http://www.shnenglu.com/aa19870406/comments/commentRss/183010.htmlhttp://www.shnenglu.com/aa19870406/services/trackbacks/183010.html#include <iostream>
#include 
<fcntl.h>
using namespace std;

int main()
{
    
int fd = open("demo.txt", O_RDWR, 0);
    close(fd);
    
int fd1 = open("demo1.txt", O_RDWR, 0);
    
char *szMsg = "hello";
    
int size = write(fd, szMsg, strlen(szMsg)+1);
    
if (-1 == size)
    
{
         cerr 
<< "error!" << endl;
    }

    close(fd1);
    
return 0;
}
猜一下上面程序的执行l果?br />在writeӞfd和fd1的值是一LQwrite fdӞ实际是write fd1?br />Z避免自己在程序中误操作,可以在close(fd)之后Q加上fd = -1;

MrRightLeft 2012-07-12 16:13 发表评论
]]>
64位网l字节序与主机字节序转换http://www.shnenglu.com/aa19870406/archive/2012/06/20/179517.htmlMrRightLeftMrRightLeftWed, 20 Jun 2012 08:50:00 GMThttp://www.shnenglu.com/aa19870406/archive/2012/06/20/179517.htmlhttp://www.shnenglu.com/aa19870406/comments/179517.htmlhttp://www.shnenglu.com/aa19870406/archive/2012/06/20/179517.html#Feedback0http://www.shnenglu.com/aa19870406/comments/commentRss/179517.htmlhttp://www.shnenglu.com/aa19870406/services/trackbacks/179517.html 64位网l字节序与主机字节序转换

unsigned long long ntohll(unsigned long long val)
{
    
if (__BYTE_ORDER == __LITTLE_ENDIAN)
    
{
        
return (((unsigned long long )htonl((int)((val << 32>> 32))) << 32| (unsigned int)htonl((int)(val >> 32));
    }

    
else if (__BYTE_ORDER == __BIG_ENDIAN)
    
{
        
return val;
    }

}


unsigned 
long long htonll(unsigned long long val)
{
    
if (__BYTE_ORDER == __LITTLE_ENDIAN)
    
{
        
return (((unsigned long long )htonl((int)((val << 32>> 32))) << 32| (unsigned int)htonl((int)(val >> 32));
    }

    
else if (__BYTE_ORDER == __BIG_ENDIAN)
    
{
        
return val;
    }

}

 



MrRightLeft 2012-06-20 16:50 发表评论
]]>
如何定义变长的TLVl构体?http://www.shnenglu.com/aa19870406/archive/2012/06/14/178803.htmlMrRightLeftMrRightLeftThu, 14 Jun 2012 07:46:00 GMThttp://www.shnenglu.com/aa19870406/archive/2012/06/14/178803.htmlhttp://www.shnenglu.com/aa19870406/comments/178803.htmlhttp://www.shnenglu.com/aa19870406/archive/2012/06/14/178803.html#Feedback4http://www.shnenglu.com/aa19870406/comments/commentRss/178803.htmlhttp://www.shnenglu.com/aa19870406/services/trackbacks/178803.html如何定义变长的TLVl构体?

TLV是一U常用的用于通信的结构体格式。T表示tagQL表示lengthQV表示value。其中T和L是固定大的QV是可变大,L表示的是V的长度。通常用于l构化网l通信中的数据。如0x3 3 'aa\0'Q?x3 5 'aaaa\0',其中0x3表示tag的|3 or 5表示的是后面的字W串的长度。由于V是可变长度的Q所以在定义TLVl构Ӟ需要将V定义成ؓ可变大小。可定义如下Q?br />
struct TLV
{
    uint8_t tag;
    uint16_t len;
    char value[0];
}__attribute__((packed));

注意value分配的是0大小Q最后一个成员ؓ可变长的数组Q对于TLVQType-Length-ValueQŞ式的l构Q或者其他需要变长度的结构体Q用q种方式定义最好。用v来非常方便,创徏Ӟmalloc一D늻构体大小加上可变长数据长度的I间l它Q可变长部分可按数组的方式访问,释放Ӟ直接把整个结构体free掉就可以了。__attribute__(packed)用来强制不对struct TLVq行4字节寚wQ目的是Z获取真实的TLV的空间用情c?br />
int main()
{
    char *szMsg = "aaaaaaaaa";
    cout << sizeof(TLV) << endl; //the size of TLV
    uint16_t len = strlen(szMsg) + 1;
    struct TLV *pTLV;
    pTLV = (struct TLV*)malloc(sizeof(struct TLV) + sizeof(char)*len);
    pTLV->tag = 0x2;
    pTLV->len = len;
    memcpy(pTLV->value, szMsg, len);
    cout << pTLV->value << endl;
    free(pTLV);
    pTLV = NULL;
    return 0;
}

q里有关于设|变长TLV的详l说明:http://www.douban.com/note/213324857/
q里有一个问题,如何实现嵌套TLVl构呢?大家有什么好的思\吗?Ƣ迎交流
单实C一下嵌套TLVQ不知道有没有问题?br />
#include <iostream>
using namespace std;

struct TLVNODE
{
    uint8_t tag;
    uint16_t len;
    char value[0];
}__attribute__ ((packed));

struct TLV
{
    int hei;
    uint8_t tag;
    uint16_t len;
    struct TLVNODE value[0];
} __attribute__ ((packed));

int main()
{
    //char *szMsg = "aaaaaaaaaaa";
    cout << sizeof(TLV) << endl;
    //uint16_t len = strlen(szMsg) + 1;

    char *szNodeMsg = "bbbbbbbbbb";
    uint16_t nodelen = strlen(szNodeMsg) + 1;
    struct TLVNODE *pNode = (struct TLVNODE *) malloc(sizeof(struct TLVNODE) + sizeof(char)*nodelen); 
    pNode->tag = 0x3;
    pNode->len = nodelen;
    memcpy(pNode->value, szNodeMsg, nodelen);


    struct TLV *pTlv;
    uint16_t nodeSize = sizeof(struct TLVNODE) + sizeof(char)*nodelen;
    pTlv = (struct TLV*)malloc(sizeof(struct TLV) + nodeSize);
    pTlv->tag = 0x2;
    pTlv->len = nodeSize;
//    pTlv->value[0] = (struct TLVNODE)*pNode;
    memcpy(pTlv->value, pNode, nodeSize);
    free(pNode);
    pNode = NULL;
    cout << sizeof(*pTlv) << endl;
    /*for (int i = 0; i < len; ++i)
    {
        pTlv->value[i] = szMsg[i]; 
    }
*/

    /*memcpy(pTlv->value, szMsg, len);*/
    //cout << pTlv->value << endl;
    free(pTlv);
    pTlv = NULL;
    return 0;
}






MrRightLeft 2012-06-14 15:46 发表评论
]]>
c++中const变量真的不可以修改吗Q?/title><link>http://www.shnenglu.com/aa19870406/archive/2012/04/10/170836.html</link><dc:creator>MrRightLeft</dc:creator><author>MrRightLeft</author><pubDate>Tue, 10 Apr 2012 15:49:00 GMT</pubDate><guid>http://www.shnenglu.com/aa19870406/archive/2012/04/10/170836.html</guid><wfw:comment>http://www.shnenglu.com/aa19870406/comments/170836.html</wfw:comment><comments>http://www.shnenglu.com/aa19870406/archive/2012/04/10/170836.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.shnenglu.com/aa19870406/comments/commentRss/170836.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/aa19870406/services/trackbacks/170836.html</trackback:ping><description><![CDATA[<div><div style="text-align: center;"><strong style="font-size: 18pt; ">c++中const变量真的不可以修改吗Q?br /><br /></strong></div>在学c++的时候,看到的大部分的书c对const关键字的介绍都是:const关键字修饰的变量的值是不可被修改的。但是事实真是如此吗Q今天做了一个小的实验,发现const变量是可以被修改的。c++代码如下:<span style="font-size: 13px; ">           </span><br /><div style="padding-top: 4px; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; background-color: #eeeeee; font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; width: 1081px; word-break: break-all; "><span style="color: #008080; "> 1</span> <span style="color: #000000; ">#include </span><span style="color: #000000; "><</span><span style="color: #000000; ">iostream</span><span style="color: #000000; ">></span><span style="color: #000000; "><br /></span><span style="color: #008080; "> 2</span> <span style="color: #0000ff; ">using</span> <span style="color: #0000ff; ">namespace</span><span style="color: #000000; "> std;<br /></span><span style="color: #008080; "> 3</span> <span style="color: #000000; "><br /></span><span style="color: #008080; "> 4</span> <span style="color: #0000ff; ">int</span><span style="color: #000000; "> main()<br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; ">{<br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; ">    </span><span style="color: #0000ff; ">const</span> <span style="color: #0000ff; ">int</span><span style="color: #000000; "> a </span><span style="color: #000000; ">=</span> <span style="color: #000000; ">3</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; ">    </span><span style="color: #0000ff; ">int</span><span style="color: #000000; ">*</span><span style="color: #000000; "> p </span><span style="color: #000000; ">=</span><span style="color: #000000; "> const_cast</span><span style="color: #000000; "><</span><span style="color: #0000ff; ">int</span><span style="color: #000000; ">*></span><span style="color: #000000; ">(</span><span style="color: #000000; ">&</span><span style="color: #000000; ">a);<br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; ">    </span><span style="color: #000000; ">*</span><span style="color: #000000; ">p </span><span style="color: #000000; ">=</span> <span style="color: #000000; ">4</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">    cout </span><span style="color: #000000; "><<</span> <span style="color: #000000; ">"</span><span style="color: #000000; ">value of p: </span><span style="color: #000000; ">"</span> <span style="color: #000000; "><<</span> <span style="color: #000000; ">*</span><span style="color: #000000; ">p </span><span style="color: #000000; "><<</span><span style="color: #000000; "> endl;<br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; ">    cout </span><span style="color: #000000; "><<</span> <span style="color: #000000; ">"</span><span style="color: #000000; ">value of a: </span><span style="color: #000000; ">"</span> <span style="color: #000000; "><<</span><span style="color: #000000; "> a </span><span style="color: #000000; "><<</span><span style="color: #000000; "> endl;<br /></span><span style="color: #008080; ">11</span> <span style="color: #000000; ">    cout </span><span style="color: #000000; "><<</span> <span style="color: #000000; ">"</span><span style="color: #000000; ">address of p: </span><span style="color: #000000; ">"</span> <span style="color: #000000; "><<</span><span style="color: #000000; "> p </span><span style="color: #000000; "><<</span><span style="color: #000000; "> endl;<br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; ">    cout </span><span style="color: #000000; "><<</span> <span style="color: #000000; ">"</span><span style="color: #000000; ">address of a: </span><span style="color: #000000; ">"</span> <span style="color: #000000; "><<</span> <span style="color: #000000; ">&</span><span style="color: #000000; ">a </span><span style="color: #000000; "><<</span><span style="color: #000000; "> endl;<br /></span><span style="color: #008080; ">13</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">14</span> <span style="color: #000000; ">    </span><span style="color: #0000ff; ">return</span> <span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">15</span> <span style="color: #000000; ">}             </span></div>上面代码W?行将a的地址赋值给指针pQ然后第8行修改p所指向的地址中的|q行l果如下Q?br /><fieldset><legend>q行l果</legend><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="color: #ff9900; background-color: #ffffff; ">value of p: 4</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="color: #ff9900; background-color: #ffffff; ">value of a: 3</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="color: #ff9900; background-color: #ffffff; ">address of p: 0x7fbffff7fc</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="color: #ff9900; background-color: #ffffff; ">address of a: 0x7fbffff7fc</span></div></div></fieldset>如上所C结果,指针p所指向的地址和变量a的地址相同Q但是p所指地址中的值已l发生改变。但是ؓ何变量a对应的地址中的值已l由3变ؓ4Q但是a的值确?呢?<br />暂时把这个问题搁。再来看一下如下的c++代码Q?br /><div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; "> 1</span> <span style="color: #000000; ">#include </span><span style="color: #000000; "><</span><span style="color: #000000; ">iostream</span><span style="color: #000000; ">></span><span style="color: #000000; "><br /></span><span style="color: #008080; "> 2</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; "> std;<br /></span><span style="color: #008080; "> 3</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> a </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">3</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; "> 4</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> main()<br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; ">{<br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; ">    </span><span style="color: #008000; ">//</span><span style="color: #008000; ">const int a = 3;</span><span style="color: #008000; "><br /></span><span style="color: #008080; "> 7</span> <span style="color: #008000; "></span><span style="color: #000000; ">    </span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">*</span><span style="color: #000000; "> p </span><span style="color: #000000; ">=</span><span style="color: #000000; "> const_cast</span><span style="color: #000000; "><</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">*></span><span style="color: #000000; ">(</span><span style="color: #000000; ">&</span><span style="color: #000000; ">a);<br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; ">    </span><span style="color: #000000; ">*</span><span style="color: #000000; ">p </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">4</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">    cout </span><span style="color: #000000; "><<</span><span style="color: #000000; "> </span><span style="color: #000000; ">"</span><span style="color: #000000; ">value of p: </span><span style="color: #000000; ">"</span><span style="color: #000000; "> </span><span style="color: #000000; "><<</span><span style="color: #000000; "> </span><span style="color: #000000; ">*</span><span style="color: #000000; ">p </span><span style="color: #000000; "><<</span><span style="color: #000000; "> endl;<br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; ">    cout </span><span style="color: #000000; "><<</span><span style="color: #000000; "> </span><span style="color: #000000; ">"</span><span style="color: #000000; ">value of a: </span><span style="color: #000000; ">"</span><span style="color: #000000; "> </span><span style="color: #000000; "><<</span><span style="color: #000000; "> a </span><span style="color: #000000; "><<</span><span style="color: #000000; "> endl;<br /></span><span style="color: #008080; ">11</span> <span style="color: #000000; ">    cout </span><span style="color: #000000; "><<</span><span style="color: #000000; "> </span><span style="color: #000000; ">"</span><span style="color: #000000; ">address of p: </span><span style="color: #000000; ">"</span><span style="color: #000000; "> </span><span style="color: #000000; "><<</span><span style="color: #000000; "> p </span><span style="color: #000000; "><<</span><span style="color: #000000; "> endl;<br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; ">    cout </span><span style="color: #000000; "><<</span><span style="color: #000000; "> </span><span style="color: #000000; ">"</span><span style="color: #000000; ">address of a: </span><span style="color: #000000; ">"</span><span style="color: #000000; "> </span><span style="color: #000000; "><<</span><span style="color: #000000; "> </span><span style="color: #000000; ">&</span><span style="color: #000000; ">a </span><span style="color: #000000; "><<</span><span style="color: #000000; "> endl;<br /></span><span style="color: #008080; ">13</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">14</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">15</span> <span style="color: #000000; ">}</span></div>如上代码g++~译通过Q在q行时报错如下:<br /><fieldset><legend>输出l果</legend><div><span style="color: red; ">Segmentation fault (core dumped)</span></div></fieldset>由此可见Q在c++中全局const变量和局部const变量的编译器处理的方法是不一L。查阅资料得知,全局const变量是不分配内存地址的,它编译器攄在符可中作为编译期帔RQ全局const变量攑֜只读数据D中Q受到只L据段的权限保护,当你修改一个只L据段中的内容Ӟ会得C个运行时错误。而局部const变量是放在堆栈之中,因ؓ在内存中有地址Q通过修改地址中的值可以达C改const所指内存中值的目的?br /></div> <div id="uxscxel" class="vimiumReset vimiumHUD" style="right: 150px; opacity: 0; display: none; "></div><img src ="http://www.shnenglu.com/aa19870406/aggbug/170836.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/aa19870406/" target="_blank">MrRightLeft</a> 2012-04-10 23:49 <a href="http://www.shnenglu.com/aa19870406/archive/2012/04/10/170836.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>声明序Q静态作用域Q动态作用域http://www.shnenglu.com/aa19870406/archive/2011/06/18/148917.htmlMrRightLeftMrRightLeftSat, 18 Jun 2011 09:37:00 GMThttp://www.shnenglu.com/aa19870406/archive/2011/06/18/148917.htmlhttp://www.shnenglu.com/aa19870406/comments/148917.htmlhttp://www.shnenglu.com/aa19870406/archive/2011/06/18/148917.html#Feedback0http://www.shnenglu.com/aa19870406/comments/commentRss/148917.htmlhttp://www.shnenglu.com/aa19870406/services/trackbacks/148917.html
 1 #include<iostream>
 2 //#include <map>
 3 //#include <string>
 4 using namespace std;
 5 
 6 int a;
 7 void first()
 8 {
 9     a = 1;
10 }
11 
12 void second()
13 {
14     int a = 7;
15     first();
16     cout << "second:" << a << endl;
17 }
18 
19 
20 int main()
21 {
22     a = 2;
23     int num;
24     cin >> num;
25     if (num > 0)
26     {
27         second();
28     }
29     else
30     {
31         first();
32     }
33     cout << a << endl;
34     return 0;
35 }
36 
猜想一下上面的代码输出的结果是什么?main函数中输出的l果?。不Z输入的num值是正数q是负数l果都是1。ؓ什么会q样呢?q是因ؓc++采用的是静态作用域规则。第9行代码是关键所在。对于c++q种静态语a而言Q第9行代码实际修改的是全局变量a的倹{所以该E序的最l结果会?。那么动态作用域规则的语a会输Z么样的结果呢Q那pҎ所输入的num来决定了?br />
c++声明变量的作用就是引q名字符P表明该变量的作用域,而定义则是给变量分配内存Qƈ且绑定值的q程。对于调用子函数的过E,Z扑ֈ子函C的变量的声明作用域,~译器采用了静态链接的Ҏ。对于程序的执行程Q编译器会维护一个栈Q栈中会存储与相应调用函数对应的帧。编译器通过栈和帧数据结构来l护E序执行所调用的函数层ơ流E。要扑ֈ一个子函数中的变量声明域实际上是在栈中相应中寻找该变量的声明。寻找vҎ当前zd帧,而当前活动又通过静态链接(相当于指针)与它的父帧相兌。但是考虑上面的程序,当输入num大于0Ӟ应该是先调用secondQ然后调用firstQ而second中对变量a重新q行了声明,如果栈中l护的层ơ是函数调用的层ơ,则此时first中修改的变量a应该是second中声明的变量a才是Q那么结果输出应该是2Q但是事实ƈ非如此。所以我认ؓ栈中的静态链接所链接的不是函数调用的层次Q而是声明的层ơ。考虑上面的程序,全局变量a和函数first的声明是在同一层次的,则如果要La中变量的声明Q应该首先查找a所在的那个模块所对应的Q姑且认为是全局帧吧Q看成有一个全局范围的函C之对应)Q则q时扑ֈ的a的声明应该就是全局变量a。所以如果按照这U分析的话,那么E序的结果就?了?br />
以上只是我的猜想Q由于最q要忙于考试Q没有时间查阅更多资料,且编译原理那块已l几乎忘得差不多了。如有错误请各位指正?br />



MrRightLeft 2011-06-18 17:37 发表评论
]]>
准备研究一下redishttp://www.shnenglu.com/aa19870406/archive/2011/06/14/148615.htmlMrRightLeftMrRightLeftMon, 13 Jun 2011 16:36:00 GMThttp://www.shnenglu.com/aa19870406/archive/2011/06/14/148615.htmlhttp://www.shnenglu.com/aa19870406/comments/148615.htmlhttp://www.shnenglu.com/aa19870406/archive/2011/06/14/148615.html#Feedback0http://www.shnenglu.com/aa19870406/comments/commentRss/148615.htmlhttp://www.shnenglu.com/aa19870406/services/trackbacks/148615.html2.׃最q准备期末考试Q所以每天晚?2:00-24:00学习2个小?img src ="http://www.shnenglu.com/aa19870406/aggbug/148615.html" width = "1" height = "1" />

MrRightLeft 2011-06-14 00:36 发表评论
]]>
01背包问题http://www.shnenglu.com/aa19870406/archive/2011/06/07/148170.htmlMrRightLeftMrRightLeftMon, 06 Jun 2011 16:55:00 GMThttp://www.shnenglu.com/aa19870406/archive/2011/06/07/148170.htmlhttp://www.shnenglu.com/aa19870406/comments/148170.htmlhttp://www.shnenglu.com/aa19870406/archive/2011/06/07/148170.html#Feedback1http://www.shnenglu.com/aa19870406/comments/commentRss/148170.htmlhttp://www.shnenglu.com/aa19870406/services/trackbacks/148170.html
  1 #include <iostream>
  2 #include <vector>
  3 #include <algorithm>
  4 #define max(a,b) ((a)>(b))?(a):(b)
  5 using namespace std;
  6 //写出来之后,试把每一个for循环用for_each来替换。或者将公用的for程用函数替?/span>
  7 struct PrintResult 
  8 {
  9     void operator()(int i)
 10     {
 11         cout << i << " ";
 12     }
 13 }printResult;
 14 
 15 struct PrintVecResult 
 16 {
 17     void operator()(vector<int> vec)
 18     {
 19         for_each(vec.begin(), vec.end(), printResult);
 20         cout << endl;
 21     }
 22 }printVecResult;
 23 
 24 int knapsack(vector<int> &vecWeight, vector<int> &vecValue, int capacity)
 25 {
 26     int num = vecWeight.size();
 27     vector<vector<int> > f(num, vector<int>(capacity, 0));
 28     vector<int> result(num, 0);
 29 
 30     int j = 0;
 31     int i = 0;
 32     for (i = 1; i <= num; ++i)
 33     {
 34         for (j = 1; j <= capacity; ++j)
 35         {
 36             if (j >= vecWeight[i])
 37             {
 38                 f[i][j] = max(f[i-1][j], f[i-1][j-vecWeight[i]] + vecValue[i]);
 39             }
 40             else
 41             {
 42                 f[i][j] = f[i-1][j];
 43             }
 44         }
 45     }
 46     //打印f数组?/span>
 47     for_each(f.begin(), f.end(), printVecResult);
 48     
 49     //打印背包所能容U的最大h?/span>
 50     cout << f[num][capacity] << endl;
 51 
 52     //打印产生最大h值的背包中物品的~号
 53     
 54     for (j = capacity, i = num; i >= 1--i)
 55     {
 56         //result[i] = f[i][j] > f[i-1][j] ? 1 : 0; 
 57         if (f[i][j] > f[i-1][j])
 58         {
 59             result[i] = 1;
 60             j = j - vecWeight[i];
 61         }
 62         else
 63         {
 64             result[i] = 0;
 65         }
 66     }
 67     
 68     for (i = 1; i <= num; ++i)
 69     {
 70         if (1 == result[i])
 71         {
 72             cout << i << " ";
 73         }
 74     }
 75     return  f[num][capacity] ;
 76 }
 77 
 78 
 79 int main()
 80 {
 81     int num = 0;
 82     int capacity = 0;
 83     cin >> num;
 84     cin >> capacity;
 85 
 86     vector<int> weight;
 87     vector<int> value;
 88     weight.push_back(0);
 89     value.push_back(0);
 90 
 91     for (int i = 1; i <= num; ++i)
 92     {
 93         int tempWeight = 0;
 94         int tempValue = 0;
 95         cin >> tempWeight >> tempValue;
 96         weight.push_back(tempWeight);
 97         value.push_back(tempValue);
 98     }
 99 
100     knapsack(weight, value, capacity);
101 
102     return 0;
103 }


MrRightLeft 2011-06-07 00:55 发表评论
]]>
计数排序http://www.shnenglu.com/aa19870406/archive/2011/06/04/148072.htmlMrRightLeftMrRightLeftSat, 04 Jun 2011 15:50:00 GMThttp://www.shnenglu.com/aa19870406/archive/2011/06/04/148072.htmlhttp://www.shnenglu.com/aa19870406/comments/148072.htmlhttp://www.shnenglu.com/aa19870406/archive/2011/06/04/148072.html#Feedback0http://www.shnenglu.com/aa19870406/comments/commentRss/148072.htmlhttp://www.shnenglu.com/aa19870406/services/trackbacks/148072.html
计数排序实现Q以学生q龄对学生信息进行排序?br />
 1 #include <iostream>
 2 #include <vector>
 3 #include <string>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 typedef struct StudentInfo 
 8 {
 9     unsigned int age;
10     string name;
11     string major;
12 }StudentInfo;
13 
14 struct StudentCount 
15 {
16     void operator()(StudentInfo stuInfo)
17     {
18         cout << stuInfo.name << " " << stuInfo.age << stuInfo.major << endl;
19     }
20 }student;
21 
22 void Countsort(vector<StudentInfo> &vec, unsigned int nMaxAge)
23 {
24     unsigned int* nCount = (unsigned int*)malloc(sizeof(unsigned int)*nMaxAge);
25     //vector<unsigned int> nCount(nMaxAge, 0);
26     memset(nCount, 0sizeof(unsigned int)*nMaxAge); //assign 0 to the array nCount
27     vector<StudentInfo>::const_iterator iter = vec.begin();
28     
29     //count the number of each age
30     for (; iter != vec.end(); ++iter) //用for_each试一?/span>
31     {
32         ++nCount[iter->age];
33     }
34 
35     //定有多个数据在当前元素的前面
36     for (int i = 1; i < nMaxAge; ++i)
37     {
38         nCount[i] += nCount[i-1];
39     }
40 
41     vector<StudentInfo> StudentSorted;
42     StudentSorted.reserve(vec.size()); //使用reserve预分配空_q些I间是否有初始值呢Q?/span>
43     StudentSorted.resize(vec.size());
44     for (int i = 0; i < vec.size(); ++ i)
45     {
46         int index = --nCount[vec[i].age];
47          StudentSorted[index] = vec[i];
48     }
49 
50     //StudentSorted数据复制到vec中?/span>
51     vec.swap(StudentSorted);
52     //for_each(vec.begin(), vec.end(), student);
53     free(nCount);
54     nCount = NULL;
55 }
56 int main()
57 {
58     vector<StudentInfo> vec;
59     //初始化vec中的数据
60     for (int i = 0; i < 20++i)
61     {
62         StudentInfo stuInfo = {i%10"qinlei""CS"};
63         vec.push_back(stuInfo);
64     }
65 
66     //开始排?/span>
67     Countsort(vec, 20);
68     //打印排序后的l果
69     for_each(vec.begin(), vec.end(), student);
70     return 0;
71 }


MrRightLeft 2011-06-04 23:50 发表评论
]]>
c++对象内存布局http://www.shnenglu.com/aa19870406/archive/2011/06/01/147889.htmlMrRightLeftMrRightLeftWed, 01 Jun 2011 11:34:00 GMThttp://www.shnenglu.com/aa19870406/archive/2011/06/01/147889.htmlhttp://www.shnenglu.com/aa19870406/comments/147889.htmlhttp://www.shnenglu.com/aa19870406/archive/2011/06/01/147889.html#Feedback0http://www.shnenglu.com/aa19870406/comments/commentRss/147889.htmlhttp://www.shnenglu.com/aa19870406/services/trackbacks/147889.html 先给Z个类Q如下:
 1 class A
 2 {
 3 public:
 4     A()
 5     {
 6         cout << "A" << endl;
 7     }
 8     virtual ~A()
 9     {
10         cout << "~A" << endl;
11     }
12     virtual void printA()
13     {
14         cout << "printA" << endl;
15     }
16 private:
17 
18     int a;
19     char c;
20     char e;
21     double b;
22     static double d;        
23 };
24 
25 int main()
26 {
27 
28     A a;
29     cout << sizeof(a) << endl; //输出?4
30     return 0;
31 }

以上代码输出是:24。也是说对象a占用内存I间大小?4字节Q这?4字节是怎么得来的呢Q我们注意到在类A中存在虚函数Q而只有类中有虚函数存在,则可以知道,在每个类对象占用内存I间的首部都会有一个虚函数表,q个虚函数表可以看成是一个指针数l,在对象a中虚函数表中d?,因ؓcA中存在两个虚函数Q每个虚函数都在虚函数表中有一个项对应。现在我们知道虚函数表是2个指针的内存大小Q所以是2*4=8字节。然后a,c,ed占用4+1+1=6字节Q由于需要进行内存对齐,所以实际上它占用的大小?字节Q即cd象中的内存按照占用内存空间最大的变量来对齐,static变量不考虑在内Q。然后是b占用8字节Qstatic变量d不占用空_lg对象a占用I间大小?Q虚函数表)+8Qa,c,e)+8(b)=24字节。具体可以在vs下调试,查看a的地址?br />
׃要考虑到内存对齐,所以。。今天有事,以后待箋


MrRightLeft 2011-06-01 19:34 发表评论
]]>
开源云计算技术系列(五)Q崛L黑马Sector/Sphere 实战?(?http://www.shnenglu.com/aa19870406/archive/2011/05/30/147721.htmlMrRightLeftMrRightLeftMon, 30 May 2011 14:46:00 GMThttp://www.shnenglu.com/aa19870406/archive/2011/05/30/147721.htmlhttp://www.shnenglu.com/aa19870406/comments/147721.htmlhttp://www.shnenglu.com/aa19870406/archive/2011/05/30/147721.html#Feedback0http://www.shnenglu.com/aa19870406/comments/commentRss/147721.htmlhttp://www.shnenglu.com/aa19870406/services/trackbacks/147721.html



MrRightLeft 2011-05-30 22:46 发表评论
]]>
STL之iterator_traitshttp://www.shnenglu.com/aa19870406/archive/2011/05/30/147687.htmlMrRightLeftMrRightLeftMon, 30 May 2011 04:01:00 GMThttp://www.shnenglu.com/aa19870406/archive/2011/05/30/147687.htmlhttp://www.shnenglu.com/aa19870406/comments/147687.htmlhttp://www.shnenglu.com/aa19870406/archive/2011/05/30/147687.html#Feedback0http://www.shnenglu.com/aa19870406/comments/commentRss/147687.htmlhttp://www.shnenglu.com/aa19870406/services/trackbacks/147687.html2.数据l构和算法的分离
3.STL左闭叛_区间
4.http://www.cnblogs.com/jeedispeed/articles/1192614.html

MrRightLeft 2011-05-30 12:01 发表评论
]]>
减少~译依赖http://www.shnenglu.com/aa19870406/archive/2011/05/27/147409.htmlMrRightLeftMrRightLeftFri, 27 May 2011 13:43:00 GMThttp://www.shnenglu.com/aa19870406/archive/2011/05/27/147409.htmlhttp://www.shnenglu.com/aa19870406/comments/147409.htmlhttp://www.shnenglu.com/aa19870406/archive/2011/05/27/147409.html#Feedback0http://www.shnenglu.com/aa19870406/comments/commentRss/147409.htmlhttp://www.shnenglu.com/aa19870406/services/trackbacks/147409.html  PImpl手法Q隐藏实现细节。用指针代替变量定义体?br />
2.interface class
  使用abstract class,U虚函数Qpure function)Q多态机制。用父类的接口调用具体子cd象的实现?br />
3.头文件中只能有声明体Q实现部分放到另一文g中。实C声明分开-接口与实现分R?br />  


MrRightLeft 2011-05-27 21:43 发表评论
]]>
有关char指针的文章一?/title><link>http://www.shnenglu.com/aa19870406/archive/2011/05/03/145535.html</link><dc:creator>MrRightLeft</dc:creator><author>MrRightLeft</author><pubDate>Tue, 03 May 2011 02:50:00 GMT</pubDate><guid>http://www.shnenglu.com/aa19870406/archive/2011/05/03/145535.html</guid><wfw:comment>http://www.shnenglu.com/aa19870406/comments/145535.html</wfw:comment><comments>http://www.shnenglu.com/aa19870406/archive/2011/05/03/145535.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/aa19870406/comments/commentRss/145535.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/aa19870406/services/trackbacks/145535.html</trackback:ping><description><![CDATA[<span style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Simsun; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span><span style="LINE-HEIGHT: 18px; BORDER-COLLAPSE: collapse" class=Apple-style-span> <table style="BORDER-COLLAPSE: collapse; TABLE-LAYOUT: fixed" border=0 cellSpacing=0 cellPadding=0 width="100%"> <tbody> <tr> <td style="LINE-HEIGHT: 27px; COLOR: rgb(0,0,0); FONT-SIZE: 18px; FONT-WEIGHT: bold" class=article_title height=30 align=middle><strong>[文章] 有关char指针的文章一?/strong></td> </tr> <tr> <td style="LINE-HEIGHT: 18px; FONT-SIZE: 9pt" bgColor=#888888 height=1 width="100%" align=middle></td> </tr> <tr> <td style="LINE-HEIGHT: 18px; FONT-SIZE: 9pt" height=2 width="100%"></td> </tr> <tr> <td style="LINE-HEIGHT: 18px; FONT-SIZE: 9pt" height=38 width="100%"> <p align=center><strong>作?/strong>Q未?span class=Apple-converted-space> </span><strong>来源</strong>Q月光Y件站<span id="xrueoeh" class=Apple-converted-space> </span><strong>加入旉</strong>Q?005-2-28 月光软g?/p> </td> </tr> <tr> <td style="LINE-HEIGHT: 18px; FONT-SIZE: 9pt" vAlign=top width="100%"><font size=2 face=Tahoma><strong>[文章] 有关char指针的文章一(转自:</strong><a ><u><font color=#0066cc face=宋体>http://www.moon-soft.com/doc/9040.htm</font></u></a>)<br></font> <p><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px">先看以下代码:<span id="gmagxpd" class=Apple-converted-space> </span><br>char *p;<span id="ryvjthr" class=Apple-converted-space> </span><br>p="abc";<span id="ipgqehv" class=Apple-converted-space> </span><br>你认为是对的?<span id="avfpgfp" class=Apple-converted-space> </span><br><br>{案Q语法上是对的,但不提倡这U写法?span class=Apple-converted-space> </span><br><br>误区1Q没有给p分配内存I间p|怎么会是对的呢?<span id="jioyiao" class=Apple-converted-space> </span><br>正解Q不hW一眼将q里的p="abc"看成?p="abc"Q然后就做出了以上的论断。这是比较笨W的错误咯:Q?span class=Apple-converted-space> </span><br>看清楚就好啦Q其实赋lp的是"abc"的地址。再_*p="abc"也不对呀Q字W串可不能这么赋倹{?span class=Apple-converted-space> </span><br><br>误区2Q这"abcd"哪来的地址,怎么能直接赋lp?<span id="djporup" class=Apple-converted-space> </span><br>正解Q先自己试试吧。在2K/XP + VC下运行这D代码,是不会出错的Q说明这D代码ƈ无问题。晕吧?猜想的话呢,是"abcd"不知道被攑֜了什么地方,然后弄来了一个地址Q给了p?span class=Apple-converted-space> </span><br><br>q到底是怎么回事呢?<span id="ilkqpdc" class=Apple-converted-space> </span><br><br>要知道,q两个语句和char *p="abc"是完全一LQ所以其中的道理也一栗?span class=Apple-converted-space> </span><br>char *p="abc"曄qh了不h呀。问问你Qp到底是什么类型的Qchar *Q错Q是const char *Q?span class=Apple-converted-space> </span><br>也就是说Q它所指向的内Ҏ不可改变的。不q要补充的是Qa的指向是可以改变的?span class=Apple-converted-space> </span><br>所以ؓ了不再引赯会,char *p="abcq种写法是不提倡的?span class=Apple-converted-space> </span><br>既然char *p="abcd"被徏议写成const char *p="abcd"Q那么char *p; p="abcd";也应该写成const char *p; p="abcd";<span id="beojphv" class=Apple-converted-space> </span><br><br>讲来讲去Q最后来得看看汇~代码。看完就明白是怎么回事了。(我才发现汇编代码原来q么爽看QVC下,没开~译器优化)Q?span class=Apple-converted-space> </span><br>我们重点先看const char *p="abc"和char p[]="abc"有什么不同(都放在main()中声明)Q?span class=Apple-converted-space> </span><br></font></p> <blockquote> <pre><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px">PHP源码:</font><hr><code><font color=#000000> <font color=#0000bb><br>void main</font><font color=#007700>() <br>{ <br>  const </font><font color=#0000bb>char </font><font color=#007700>*</font><font color=#0000bb>p</font><font color=#007700>=</font><font color=#dd0000>"abc"</font><font color=#007700>; <br>} <br> <br></font><font color=#0000bb>3</font><font color=#007700>:        const </font><font color=#0000bb>char </font><font color=#007700>*</font><font color=#0000bb>p</font><font color=#007700>=</font><font color=#dd0000>"abc"</font><font color=#007700>; <br></font><font color=#0000bb>00401028   mov         dword ptr </font><font color=#007700>[</font><font color=#0000bb>ebp</font><font color=#007700>-</font><font color=#0000bb>4</font><font color=#007700>],</font><font color=#0000bb>offset string </font><font color=#dd0000>"abc" </font><font color=#007700>(</font><font color=#0000bb>0041f01c</font><font color=#007700>) <br> <br></font><font color=#0000bb>void main</font><font color=#007700>() <br>{ <br>  </font><font color=#0000bb>char p</font><font color=#007700>[]=</font><font color=#dd0000>"abc"</font><font color=#007700>; <br>} <br> <br></font><font color=#0000bb>3</font><font color=#007700>:        </font><font color=#0000bb>char p</font><font color=#007700>[]=</font><font color=#dd0000>"abc"</font><font color=#007700>; <br></font><font color=#0000bb>00401028   mov         eax</font><font color=#007700>,[</font><font color=#0000bb>string </font><font color=#dd0000>"abc" </font><font color=#007700>(</font><font color=#0000bb>0041f01c</font><font color=#007700>)] <br></font><font color=#0000bb>0040102D   mov         dword ptr </font><font color=#007700>[</font><font color=#0000bb>ebp</font><font color=#007700>-</font><font color=#0000bb>4</font><font color=#007700>],</font><font color=#0000bb>eax<br></font> </font> </code><hr></pre> </blockquote><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px"><br>看出差别了吗Q上一DASM用offset?abc"的地址Q然后赋l[ebp-4]Q也是pQ下同)?span class=Apple-converted-space> </span><br>而下一DASM却{了一个弯Q先?abc"的地址转到寄存器eaxQ然后再转赋lp?span class=Apple-converted-space> </span><br><br>有疑问了Qؓ什么不和上面的一P直接用offsetQVC是很聪明的(废话QM$的东西呀Q,不用offsetQ恐怕就是用不了了?span class=Apple-converted-space> </span><br>offset是一条伪指oQ在~译的时候就已经把偏U量好了。offset是无法执行间接寻址的计的?span class=Apple-converted-space> </span><br><br>说明了什么?<span id="znpnxlz" class=Apple-converted-space> </span><br><br>const char *p="abc"中的"abc"Q在~译期间已l处理好Q要了一块内存,存v来了Q在把地址赋给p的时候,可以直接用offset计算?span class=Apple-converted-space> </span><br>而char p[]="abc"中的"abc"Q是在运行期间动态分配内存给"abc"Q然后再出地址Q赋lp。heheQ这同时也说明了数组和指针的{h性?span class=Apple-converted-space> </span><br><br>我们再做一ơ实验,q一ơ我们把char p[]="abc"攑֜main()外,q在main()内用一个指针再指向p看看?span class=Apple-converted-space> </span><br></font> <blockquote> <pre><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px">PHP源码:</font><hr><code><font color=#000000> <font color=#0000bb><br>char p</font><font color=#007700>[]=</font><font color=#dd0000>"abc"</font><font color=#007700>; <br> <br></font><font color=#0000bb>void main</font><font color=#007700>() <br>{ <br>  </font><font color=#0000bb>char </font><font color=#007700>*</font><font color=#0000bb>t</font><font color=#007700>=</font><font color=#0000bb>p</font><font color=#007700>; <br>} <br> <br></font><font color=#0000bb>5</font><font color=#007700>:      </font><font color=#0000bb>char </font><font color=#007700>*</font><font color=#0000bb>t</font><font color=#007700>=</font><font color=#0000bb>p</font><font color=#007700>; <br></font><font color=#0000bb>00401028   mov         dword ptr </font><font color=#007700>[</font><font color=#0000bb>ebp</font><font color=#007700>-</font><font color=#0000bb>4</font><font color=#007700>],</font><font color=#0000bb>offset p </font><font color=#007700>(</font><font color=#0000bb>00421adc</font><font color=#007700>)<br></font><font color=#0000bb></font> </font> </code><hr></pre> </blockquote><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px"><br>q回p[]的声明放在main()外,变成了全局变量。结果main()内的t取p的指针的时候,直接用offset可以计算出来?span class=Apple-converted-space> </span><br><br>据小矛_所_字面|constQstaticQinlineQ全局变量都是攑֜静态数据区的。(但我感觉g不是如此Q只是全局变量和字W串在编译时处理好攑֜一P<span id="jqlzjbh" class=Apple-converted-space> </span><br><br>不难发现Qp[]被声明成全局变量后,可以直接用offset计算地址Q说明静态数据区是编译时已l处理好的?br>再对照const char *p="abc"的ASMQ我们马上想刎ͼ"abc"是被C/C++存在静态数据区中的Q它的地址是"abc"在静态数据区的地址Q?span class=Apple-converted-space> </span><br><br>弄清了这个,有些问题也就可以惛_通了。下面这U用法,看来不能说是错误的了Q因?abc"是在静态数据区的,生存期可以说是整个程序:<span id="drtojqe" class=Apple-converted-space> </span><br></font> <blockquote> <pre><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px">PHP源码:</font><hr><code><font color=#000000> <font color=#0000bb><br></font><font color=#ff8000>#include "stdio.h" <br> <br></font><font color=#007700>const </font><font color=#0000bb>char </font><font color=#007700>*</font><font color=#0000bb>fun</font><font color=#007700>() <br>{ <br>  const </font><font color=#0000bb>char </font><font color=#007700>*</font><font color=#0000bb>p</font><font color=#007700>=</font><font color=#dd0000>"abc"</font><font color=#007700>; <br>  return </font><font color=#0000bb>p</font><font color=#007700>; <br>} <br> <br></font><font color=#0000bb>void main</font><font color=#007700>() <br>{ <br>  const </font><font color=#0000bb>char </font><font color=#007700>*</font><font color=#0000bb>t</font><font color=#007700>=</font><font color=#0000bb>fun</font><font color=#007700>(); <br>  </font><font color=#0000bb>printf </font><font color=#007700>(</font><font color=#dd0000>"%s"</font><font color=#007700>,</font><font color=#0000bb>t</font><font color=#007700>); <br>}<br></font><font color=#0000bb></font> </font> </code><hr></pre> </blockquote><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px"><br><br>看ASMQ?span class=Apple-converted-space> </span><br></font> <blockquote> <pre><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px">PHP源码:</font><hr><code><font color=#000000> <font color=#0000bb><br>5</font><font color=#007700>:      const </font><font color=#0000bb>char </font><font color=#007700>*</font><font color=#0000bb>p</font><font color=#007700>=</font><font color=#dd0000>"abc"</font><font color=#007700>; <br></font><font color=#0000bb>00401038   mov         dword ptr </font><font color=#007700>[</font><font color=#0000bb>ebp</font><font color=#007700>-</font><font color=#0000bb>4</font><font color=#007700>],</font><font color=#0000bb>offset string </font><font color=#dd0000>"%d" </font><font color=#007700>(</font><font color=#0000bb>0042001c</font><font color=#007700>)<br></font><font color=#0000bb></font> </font> </code><hr></pre> </blockquote><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px"><br>一样也是用offset计算地址?span class=Apple-converted-space> </span><br><br>C/C++l字W串的待遇真是太好了。ؓ了一个字W串Q几乎可以打破所有的指针规则。晕~~~~Q完Q?span class=Apple-converted-space> </span><br><br>附:W一ơ写q么长的文章Q写得挺晕的。本来我的C/C++也不是很U熟的,ASM也是一知半解,今天在CSDN上ؓq个问题郁闷了半天,和几个h讨论了一下,最后就写了q么一文章。希望大家赏脸看看~~~有错一定要指正啊!最后特别感谢小矛_Q想飞的菜鸟Q骄傲的矛_Q菜菜,都是他咯Q,q有阿哥(是Kingzeus咯)的帮忙~~~~~~谢谢咯~~~~~~</font> <p> </p> <p> </p> <p><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px">__________________<br>菜?-> 菜菜的老虎</font></p> <p><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px"><strong>骄傲的石头回复:</strong></font></p> <p><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px">堆几盘积木,心情好些了,所以再重新写一遍?span class=Apple-converted-space> </span><br>关于字符串的q个问题Q我一直在心里困惑着。所以呢Q昨天就看了一下?span class=Apple-converted-space> </span><br>以前回答别h的时候,L很简单的回答Q字W串是const char *指针Q指向它的入口地址。现在想来真是惭愧,虽然q个事实好象已经为大家所接受Q甚x有h探讨q这个问题!所以我怿我的发现对大家大多数是有好处的?span class=Apple-converted-space> </span><br>首先L以下代码<span id="yihcmps" class=Apple-converted-space> </span><br></font></p> <blockquote> <pre><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px">PHP源码:</font><hr><code><font color=#000000> <font color=#0000bb><br></font><font color=#ff8000>#include <iostream> <br>#include <iomanip> <br> <br></font><font color=#0000bb>using namespace std</font><font color=#007700>; <br> <br></font><font color=#0000bb>int main</font><font color=#007700>() <br>{ <br>    const </font><font color=#0000bb>char </font><font color=#007700>*</font><font color=#0000bb>p </font><font color=#007700>= </font><font color=#0000bb>0</font><font color=#007700>; <br>    </font><font color=#0000bb>char </font><font color=#007700>*</font><font color=#0000bb>p2 </font><font color=#007700>= </font><font color=#0000bb>p</font><font color=#007700>; <br>    return </font><font color=#0000bb>0</font><font color=#007700>; <br>}<br></font><font color=#0000bb></font> </font> </code><hr></pre> </blockquote> <p><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px"><br><br>以上代码有问题吗Q?如果你说没有Q请你试一下。很明显Q这是有问题的。const是ؓ了保证不变性,而你把他变成non constQ肯定有错误或者警告,要么p用const_cast转换?span class=Apple-converted-space> </span><br>所以上面的代码不能通过~译?span class=Apple-converted-space> </span><br><br>那么q就很明昄在lee的post里出C问题Q当然我以前也一直是q么认ؓQ甚臛_多h都是q么认ؓ。难道这是编译器对字W串的特D处理吗Q?q是其他的原因?<span id="hgfpvjx" class=Apple-converted-space> </span><br><br>于是我想看看I竟。就动用了RTTIQ我飞快的键入了以下代码?span class=Apple-converted-space> </span><br></font></p> <blockquote> <pre><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px">PHP源码:</font><hr><code><font color=#000000> <font color=#0000bb><br></font><font color=#ff8000>#include <iostream> <br>#include <iomanip> <br> <br></font><font color=#0000bb>using namespace std</font><font color=#007700>; <br> <br></font><font color=#0000bb>int main</font><font color=#007700>() <br>{ <br>   </font><font color=#0000bb>cout </font><font color=#007700><< </font><font color=#0000bb>typeid</font><font color=#007700>(</font><font color=#dd0000>"abc"</font><font color=#007700>).</font><font color=#0000bb>name</font><font color=#007700>() << </font><font color=#0000bb>endl</font><font color=#007700>; <br>   return </font><font color=#0000bb>0</font><font color=#007700>; <br>}<br></font><font color=#0000bb></font> </font> </code><hr></pre> </blockquote> <p><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px"><br><br>你说l果是什么?<span id="vvbpzyx" class=Apple-converted-space> </span><br>是char [4]Q而不是const char *;<span id="mbscqex" class=Apple-converted-space> </span><br>好,q个l果解决了我心中的疑点,原来是这Pq可以很单的解释char *p = "abc"q个问题?数组是一个char *const 指针Q当然可以赋lchar *指针而不会媄响其帔R性。所以这是完全正的赋倹{?span class=Apple-converted-space> </span><br>其实q想h也很q_Q指针是没有分配I间的地址而已Q而数l是一U容器,占用q箋的储存空间。想惛_W串p知道它是一个数l!而不是指针!真正意义上的指针只能是地址Q而它在分配了q箋的空间后可以作ؓ数组来用,q是׃他们的共性而决定的?span class=Apple-converted-space> </span><br><br>哈哈Q心情愉快,所以也接着看了下lee上面所做的探讨。字W串是放在静态储存区没错Q毫无疑问。至于位|~ 偶不惛__lee在上面分析了很多。所以我只对它进行了一下简单的试?span class=Apple-converted-space> </span><br>我手头上只有dev c++ ?vc70~译器,所以就只用他们q行了测试。(打开了全部优化)<span id="rscbpsv" class=Apple-converted-space> </span><br></font></p> <blockquote> <pre><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px">PHP源码:</font><hr><code><font color=#000000> <font color=#0000bb><br></font><font color=#ff8000>#include <iostream> <br>#include <iomanip> <br> <br></font><font color=#0000bb>using namespace std</font><font color=#007700>; <br> <br></font><font color=#0000bb>int main</font><font color=#007700>() <br>{ <br>    </font><font color=#0000bb>char </font><font color=#007700>*</font><font color=#0000bb>p </font><font color=#007700>= </font><font color=#dd0000>"abc" <br>    </font><font color=#0000bb>char </font><font color=#007700>*</font><font color=#0000bb>p2 </font><font color=#007700>= </font><font color=#dd0000>"abc"</font><font color=#007700>; <br>    </font><font color=#0000bb>p</font><font color=#007700>[</font><font color=#0000bb>1</font><font color=#007700>] = </font><font color=#dd0000>'k'</font><font color=#007700>; <br>    </font><font color=#0000bb>p2</font><font color=#007700>[</font><font color=#0000bb>1</font><font color=#007700>] = </font><font color=#dd0000>'j' <br>    </font><font color=#0000bb>cout </font><font color=#007700><< </font><font color=#0000bb>p1 </font><font color=#007700><< </font><font color=#0000bb>endl</font><font color=#007700>; <br>    </font><font color=#0000bb>cout </font><font color=#007700><< </font><font color=#0000bb>p2 </font><font color=#007700><< </font><font color=#0000bb>endl</font><font color=#007700>; <br>    return </font><font color=#0000bb>0</font><font color=#007700>; <br>}<br></font><font color=#0000bb></font> </font> </code><hr></pre> </blockquote> <p><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px"><br><br>l果呢?在dev c++下报错, 原因我想可能是因为在dev c++在对静态储存区q行了保护。而vc70下,通过Qƈ且两个输出是不同的。所以偶ȝvc70产生的msil码,原来vc70每次处理字符串都在静态区分配了空_而且q两?abc"是连l分配的Q这里就没有出现Solmyr说的那种情况。我想一般比较好的编译器也应该这么说。至于vc60,偶没有测试,但是可能Solmyr说的情况会出现吧。但q样是不好的Q相信这样会出现很多微妙的情c?span class=Apple-converted-space> </span><br>所以,引用字符串的最x式是const char *指针Q但char *指针是完全没错的。于情于理,也说的过d<img border=0 alt="" src="http://cpp.chinaccd.net/bbs/images/smilies/biggrin.gif"><span id="zpgmwdj" class=Apple-converted-space> </span>?span class=Apple-converted-space> </span><br><br>如果你还要问Q那用指针接受数l呢Q?呵呵Q你该仔l看看前面了。相信这会给你帮助?/font></p> <p> </p> <p> </p> <p><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px">__________________<br><font color=blue>不可一日无酒无肉无女h</font></font></p> <img border=0 src="http://www.moon-soft.com/doc/down_info.asp?id=9040" width=1 height=1></td> </tr> </tbody> </table> </span></span> <img src ="http://www.shnenglu.com/aa19870406/aggbug/145535.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/aa19870406/" target="_blank">MrRightLeft</a> 2011-05-03 10:50 <a href="http://www.shnenglu.com/aa19870406/archive/2011/05/03/145535.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>cM成员变量和成员函数在内存中的地址http://www.shnenglu.com/aa19870406/archive/2011/03/25/142735.htmlMrRightLeftMrRightLeftFri, 25 Mar 2011 11:57:00 GMThttp://www.shnenglu.com/aa19870406/archive/2011/03/25/142735.htmlhttp://www.shnenglu.com/aa19870406/comments/142735.htmlhttp://www.shnenglu.com/aa19870406/archive/2011/03/25/142735.html#Feedback0http://www.shnenglu.com/aa19870406/comments/commentRss/142735.htmlhttp://www.shnenglu.com/aa19870406/services/trackbacks/142735.html#include <iostream>
using namespace std;

class Test
{
public:
 int a;
 int b;
 void print();
 void s();
 void ss();
 void fs();
};
void Test::print()
{
 //cout << "hello" << endl;
}

void Test::s()
{

}

void Test::ss()
{

}
void Test::fs()
{

}


void f()
{
 int s = 3;
 cout << "&s" << &s << endl;
 cout << "f" << endl;
}

class B:Test
{

};

int main()
{
 Test t;
 cout << sizeof(t) << endl;
 cout << &t.a << endl;
 cout << &t.b << endl;
 Test tt;
 cout << &tt.a << endl;
 cout << &tt.b << endl;
 typedef void (Test::*p)(void);
 ////Test t;
 ////t.print();
 p fun = &Test::print;
 printf("%p\n",fun);
 fun = &Test::s;
 printf("%p\n",fun);

 fun = &Test::ss;
 printf("%p\n",fun);
 fun = &Test::fs;
 printf("%p\n",fun);
 f();
 cout << "--------" << endl;
 B b;
 cout << sizeof(b) << endl;
 ////((Test::*print)fun)();
 //Test *p4;
 //fun(p4);
 //  Test t;
 //  (t.*fun)();
 //  Test d;
 //  (d.*fun)();
}


cȝ成员函数不是在类实例化的时候蝲入内存的。应该是~译链接的时候就在程序文件中定了相对地址。然后程序蝲入的时候,所有的函数都蝲入到内存的代码区。所以实例化对象的时候,只是甌了对象的成员变量的地址Q成员函数对于所有的cd象来_应该只有一份,在代码区q。而且cȝ成员变量和成员函C是存攑֜一P地址不是q箋的,是分开存放的)
TestcM的a,b变量地址是连l的Q每个占4字节。但是s(),ss(),fs()不是和a,bq箋的,而且Q这些函C_好像也ƈ不是严格q箋的,改一下函数名Q地址有可能会变化



MrRightLeft 2011-03-25 19:57 发表评论
]]>
Singleton的设?-l典http://www.shnenglu.com/aa19870406/archive/2011/03/09/141408.htmlMrRightLeftMrRightLeftWed, 09 Mar 2011 04:36:00 GMThttp://www.shnenglu.com/aa19870406/archive/2011/03/09/141408.htmlhttp://www.shnenglu.com/aa19870406/comments/141408.htmlhttp://www.shnenglu.com/aa19870406/archive/2011/03/09/141408.html#Feedback0http://www.shnenglu.com/aa19870406/comments/commentRss/141408.htmlhttp://www.shnenglu.com/aa19870406/services/trackbacks/141408.html转自Q?a >http://www.techmango.com/blog/article/DotNet/Thread_Safe_Singleton_Instance.htm
许多同志都会采用一个double check的方式来创徏一个SingletonQ?/p>

public class Singleton
{
    protected Singleton() { }
    private static volatile Singleton instance = null;
    /// Lazy方式创徏唯一实例的过E?br>    public static Singleton Instance()
    {
        if (instance == null)         // 外层if
            lock (typeof(Singleton))      // 多线E中׃n资源同步
                if (instance == null) // 内层if
                    instance = new Singleton();
        return instance;
    }
}
 

q应该是比较l典的线E安全的Singleton创徏方式Q但是还是一个更加简单也很Cool的线E安全的SingletonQ?/p>

class Singleton
{
    private Singleton() { }
    public static readonly Singleton Instance = new Singleton();
}
 

  它省M上面CZ中那个laze构造过E,׃Instance是类的公共静态成员,因此相当于它会在cȝ一ơ被用到的时候被构造,同样的原因也可以省L它放在静态构造函数里的过E?/p>


q里实例构造函数被d定义为私有的Q所以客L序和子类无法额外构造新的实例,所有的讉K通过公共静态成员Instance获得唯一实例的引用,W合Singleton的设计意图?/p>

MrRightLeft 2011-03-09 12:36 发表评论
]]>
c++学习?--volatile和线E安全的singleton模式http://www.shnenglu.com/aa19870406/archive/2011/03/09/141405.htmlMrRightLeftMrRightLeftWed, 09 Mar 2011 03:47:00 GMThttp://www.shnenglu.com/aa19870406/archive/2011/03/09/141405.htmlhttp://www.shnenglu.com/aa19870406/comments/141405.htmlhttp://www.shnenglu.com/aa19870406/archive/2011/03/09/141405.html#Feedback0http://www.shnenglu.com/aa19870406/comments/commentRss/141405.htmlhttp://www.shnenglu.com/aa19870406/services/trackbacks/141405.html参考:http://www.cnblogs.com/rocketfan/archive/2009/12/05/1617759.html
volatileQ?br>1.volatile的作用:
(1) the content of a volatile variable is “unstable” (can change by means unknown to the compiler),

(2) all writes to volatile data are “observable” so they must be executed religiously, and

(3) all operations on volatile data are executed in the sequence in which they appear in the source code.
1.被声明ؓvolatile的变量其内容是不E_?unstable),它的值有可能q译器所不能知晓的情冉|改变?br>2.所有对声明为volatile的变量的写操作都是可见的Q必M格执行be executed religiously?br>3.所有对声明为volatile的变量的操作Q读写)都必M格按照源代码的顺序执行?br>volatile保每次直接从内存读取变量的倹{java中的volatile是跨U程保证上述三个条g的,而C++只是单一U程内保证?br>但是即是JAVA能够跨越U程保证Q仍然是不够的因为volatile和非volatile操作之间的顺序仍然是未定义的Q有可能产生问题Q考虑下面的代码:

volatile int vi;

void bar(void) {
vi = 1;
foo();
vi = 0;
}

我们一般会认ؓvi会在调用foo之前讄?,调用完后会被|ؓ0。然而编译器不会对你保证q一点,它会很高兴的你的foo()UMQ比如跑到vi = 1前面Q只要它知道在foo()里不会涉及到其它的volatile操作。所以安全的Ҏ是用栅栏memory barrier例如“asm volatile (”" ::: “memory”)加到foo的前面和后面 来保证严格的执行序?span style="COLOR: red">内存屏障保证代码执行时严格按照源代码的的序?br>



MrRightLeft 2011-03-09 11:47 发表评论
]]>
main函数之前q了马Q?谁调用了我的mainhttp://www.shnenglu.com/aa19870406/archive/2011/03/08/141386.htmlMrRightLeftMrRightLeftTue, 08 Mar 2011 15:34:00 GMThttp://www.shnenglu.com/aa19870406/archive/2011/03/08/141386.htmlhttp://www.shnenglu.com/aa19870406/comments/141386.htmlhttp://www.shnenglu.com/aa19870406/archive/2011/03/08/141386.html#Feedback0http://www.shnenglu.com/aa19870406/comments/commentRss/141386.htmlhttp://www.shnenglu.com/aa19870406/services/trackbacks/141386.html(转蝲?a >http://topic.csdn.net/u/20101013/16/e5f2fcbb-528f-4b1a-b85c-aaa8aa9ab3b6.htmlQ?br>main函数之前--真正的函数执行入口或开?/p>

一U解?/p>

实际上,在可执行文g被加载之后,控制权立即交l由~译器插入的Start函数Q它对后面q些全局变量q行准备Q?br>   _osver 操作pȝ的构件编?br>  _winmajor 操作pȝ的主版本?br>  _winminor 操作pȝ的次版本?br>  _winver 操作pȝ完全版本?br>  __argc 命o行参C?br>  __argv 指向参数字符串的指针数组
  _environ 指向环境变量字符串的指针数组
Start函数初始化堆q调用main函数Qmian函数q回之后,Start函数调用Exit函数l束该进E.
启动函数Start的源代码在:
   crt0.c Microsoft Visual C++
  c0w.asm Borladn C++

另一U解?/p>

Some of the stuff that has to happen before main():  
set up initial stack pointer  
initialize static and global data  
zero out uninitialized data  
run global constructors

Some of this comes with the runtime library's crt0.o file or its __start() function. Some of it you need to do yourself.
Crt0 is a synonym for the C runtime library.  
Depending on the system you're using the follwing may be incomplete, but it should give you an idea. Using newlib-1.9.0/libgloss/m68k/crt0.S as an outline, the steps are:  
1. Set stack pointer to value of __STACK if set  
2. Set the initial value of the frame pointer  
3. Clear .bss (where all the values that start at zero go)  
4. Call indirect of hardware_init_hook if set to initialize hardware  
5. Call indirect of software_init_hook if set to initialize software  
6. Add __do_global_dtors and __FINI_SECTION__ to the atexit function so destructors and other cleanup functions are called when the program exits by either returning from main, or calling exit  
7. setup the paramters for argc, argv, argp and call main  
8. call exit if main returns

W三U解释:囫囵C语言Q三Q:谁调用了我的 mainQ?br>    
    现在最重要的是要跟得上潮流Q所以套用比较时髦的话,谁动了我的奶酪。谁调用了我?mainQ不q作机工作者,我劝大家q是不要赶时髦,今天Java热,明天 .net 行Q什么时髦就学什么。我的意思是先花几年把基本功学好Q等你赶旉的时候也好事半功倍。废话不多说了?br>    
    我们都听说过一句话Q?#8220;main是C语言的入?#8221;。我至今不明白ؓ什么这么说。就好像如果有h_“挣钱是?#8221;Q肯定无数砖头拍q来。这句话应该?#8220;挣钱是妞的一个条Ӟ只不q这个条件特别重?#8221;。那么上面那句话应该?“main是C语言中一个符P只不q这个符h较特别?#8221;
    
    我们看下面的例子Q?br>    
    /* file name test00.c */
    
    int main(int argc, char* argv)
    {
     return 0;
    }
    
    ~译链接它:
    cc test00.c -o test.exe
    会生?test.exe
    
    但是我们加上q个选项Q?-nostdlib (不链接标准库)
    cc test00.c -nostdlib -o test.exe
    链接器会报错Q?br>    undefined symbol: __start
    
    也就是说Q?br>    1. ~译器缺省是?__start W号Q而不?main
    2. __start q个W号是程序的起始?br>    3. main 是被标准库调用的一个符?br>    
    再来思考一个问题:
    我们写程序,比如一个模块,通常要有 initialize ?de-initializeQ但是我们写 C E序的时候ؓ什么有些模块没有这两个q程么呢Q比如我们程序从 main 开始就可以 mallocQfreeQ但是我们在 main 里面却没有初始化堆。再比如?main 里面可以直接 printfQ可是我们ƈ没有打开标准输出文g啊?不知道什么是 stdinQstdoutQstderr 以及 printf ?stdout 关系的群众请先看?C 语言中文件的概念)?br>    
    有h_q些东西不需要初始化。如果您真得q么惻Ih不要再往下看了,我个机软g不适合您?br>    
    聪明的h民群众会惻I一定是?main 之前q了些什么。ɘq些函数可以直接调用而不用初始化。通常Q我们会在编译器的环境中扑ֈ一个名字类g crt0.o 的文Ӟq个文g中包含了我们刚才所说的 __start W号。(crt 大概?C Runtime 的羃写,请大家帮助确认一下。)
    
    那么真正?crt0.s 是什么样子呢Q下面我们给出部分伪代码Q?br>    
    ///////////////////////////////////////////////////////
    section .text:
    __start:
    
     :
     init stack;
     init heap;
     open stdin;
     open stdout;
     open stderr;
     :
     push argv;
     push argc;
     call _main; (调用 main)
     :
     destory heap;
     close stdin;
     close stdout;
     close stderr;
     :
     call __exit;
    ////////////////////////////////////////////////////
    
    实际上可能还有很多初始化工作Q因为都是和操作pȝ相关的,W者就不一一列出了?br>    
    注意Q?br>    1. 不同的编译器Q不一定缺省得W号都是 __start?br>    2. 汇编里面?_main 是 C 语言里面?mainQ是因ؓ汇编器和C~译器对W号的命名有差异Q通常是差一个下划线'_'Q?br>    3. 目前操作pȝl构有两个主要的分支Q微内核和宏内核。微内核的优ҎQ结构清晎ͼ单,内核lg较少Q便于维护;~点是,q程间通信较多Q程序频J进出内核,效率较低。宏内核正好相反。我说这个是什么目的是Q没办法保证每个lg都在用户I间Q标准库函数Q中初始化,有些lg实可能不要初始化,操作pȝ在创E的时候在内核I间做的。这依赖于操作系l的具体实现Q比如堆Q宏内核l构可能在内核初始化Q微内核l构在用L_即同样是微内核Q这个东东也可能会被拿到内核I间初始化?br>    
    随着 CPU 技术的发展Q存储量的迅速扩展,代码复杂E度的增加,微内核被来多的采用。你会ؓ?10% 的效率代码复杂度增加么Q要知道每隔 18 个月 CPU 的速度׃M番。所以我对程序员的要求是Q我首先不要你的代码效率高,我首先要你的代码能让 80% 的hq速看懂ƈ可以l护?/p>

ȝQ?/p>

main函数执行之前Q主要就是初始化pȝ相关资源Q?/p>

1.讄栈指?/p>

2.初始化static静态和global全局变量Q即dataD늚内容

3.未初始化部分的赋初|数值型shortQintQlong{ؓ0Qbool为FALSEQ指针ؓNULLQ等{,?bssD늚内容

4.q行全局构造器Q估计是C++中构造函Ccȝ?/p>

5.main函数的参敎ͼargcQargv{传递给main函数Q然后才真正q行main函数



MrRightLeft 2011-03-08 23:34 发表评论
]]>
պƷþþþþ| žžþþƷר| ξþ99ƷþþþþС˵ | պþþþƷӰԺҳ | þþþƷһ| þһŷպ| ŷպƷþ| һþaþþƷvrۺ| 99reþþƷҳ2020| þùƷƵ| þþƷ99þþùŴ| avþþþòվ | 99þ99þþƷ| ŷԴսþþþþ| ޾ƷŮþþ| 99þþùƷ޿| þݺҹҹav˳| ۺҹҹþ | һɫþHEZYO| þþƷ99͵ | 99ƷþþƷ| þۺav| þþþþþŮú| þۺ| ŷƷרþ| AVþþþò| պAvĻþþ޸ | 99þþƷһ| þ޾ƷƷ| 99þѹƷ| һһþaþþƷۺ鶹| þ99Ʒþþþ| ˾þô߽Ʒ | ձƷþþþӰԺձ| ˾þü91| ˾þۺӰԺ| 99þþƷѹƬ| þþŷղa| þһѲ| Ʒ99þþþþè| ƷþþĻѿ|