07 2011 档案

摘要:C语言是C++的子集,C++是C语言的超集。C++是在C语言的基础上,添加了面向对象和泛型编程的功能后,扩展而成的。1)起源1970年,AT&T贝尔实验室的Ken Thompson和Dennis Ritchie等人在DEC公司的PDP-7小型机上开发出了Unix操作系统,Dennis Ritchie以B语言为基础,参考了Algol68,于1972年设计出了C语言。1973年他们用C语言重写了Unix,2)K&R C开始的很多年,C语言没有国际标准,只有一个事实标准K&R C。直到1989年和1990年,才分别推出了ANSI C和ISO C(C89或C90);1999年I 阅读全文
posted @ 2011-07-25 19:34 Lunaa 阅读(264) 评论(0) 推荐(0) 编辑
摘要:数据模型(LP32 ILP32 LP64 LLP64 ILP64 )32位环境涉及"ILP32"数据模型,是因为C数据类型为32位的int、long、指针。而64位环境使用不同的数据模型,此时的long和指针已为64位,故称作"LP64"数据模型。现今所有64位的类Unix平台均使用LP64数据模型,而64位Windows使用LLP64数据模型,除了指针是64位,其他基本类型都没有变。TYPE LP32 ILP32 LP64 ILP64 LLP64CHAR 8 8 8 8 8SHORT 16 16 16 16 16INT 16 32 32 64 32LO 阅读全文
posted @ 2011-07-21 12:31 Lunaa 阅读(229) 评论(0) 推荐(0) 编辑
摘要:Visual C++ Windows 用来定位 DLL 的搜索路径通过隐式和显式链接,Windows 首先搜索“已知 DLL”,如 Kernel32.dll 和 User32.dll。Windows 然后按下列顺序搜索 DLL: 1. 当前进程的可执行模块所在的目录。 2. 当前目录。 3. Windows 系统目录。GetSystemDirectory 函数检索此目录的路径。 4. Windows 目录。GetWindowsDirectory 函数检索此目录的路径。 5. PATH 环境变量中列出的目录。 阅读全文
posted @ 2011-07-20 23:04 Lunaa 阅读(154) 评论(0) 推荐(0) 编辑
摘要:Assembly Manifest 通俗简易手册恩,为了大家都能很方便的理解,我将尽量简单通俗地进行描述。[现象]对这个问题的研究是起源于这么一个现象:当你用VC++2005(或者其它.NET)写程序后,在自己的计算机上能毫无问题地运行,但是当把此exe文件拷贝到别人电脑上时,便不能运行了,大致的错误提示如下:应用程序配置不正确,请重新安装程序……或者是MSVCR80D.dll 没有找到什么的(我记得不是很清楚,不过大致是这样的)[分析]看到这样的提示,当然不会傻到重装咯。第一反应应该是什么配置有问题、或者是缺少了什么依赖的库文件;于是我就根据以前Windows缺少库文件的经验,把所有库文件( 阅读全文
posted @ 2011-07-20 22:58 Lunaa 阅读(417) 评论(0) 推荐(0) 编辑
摘要:Assembly Manifest 通俗简易手册恩,为了大家都能很方便的理解,我将尽量简单通俗地进行描述。[现象]对这个问题的研究是起源于这么一个现象:当你用VC++2005(或者其它.NET)写程序后,在自己的计算机上能毫无问题地运行,但是当把此exe文件拷贝到别人电脑上时,便不能运行了,大致的错误提示如下:应用程序配置不正确,请重新安装程序……或者是MSVCR80D.dll 没有找到什么的(我记得不是很清楚,不过大致是这样的)[分析]看到这样的提示,当然不会傻到重装咯。第一反应应该是什么配置有问题、或者是缺少了什么依赖的库文件;于是我就根据以前Windows缺少库文件的经验,把所有库文件( 阅读全文
posted @ 2011-07-20 22:58 Lunaa 阅读(235) 评论(0) 推荐(0) 编辑
摘要:Useful New Features in C++0xBy Andrew Koenig and Barbara E. Moo, July 19, 2011原文链接:http://drdobbs.com/cpp/231002092?pgno=1Enhanced type inference, simpler iterators, and new container constructors head the list of handy new featuresThis is the first of a three-part on what's new and important in 阅读全文
posted @ 2011-07-20 14:06 Lunaa 阅读(196) 评论(0) 推荐(0) 编辑
摘要:Useful New Features in C++0xBy Andrew Koenig and Barbara E. Moo, July 19, 2011原文链接:http://drdobbs.com/cpp/231002092?pgno=1Enhanced type inference, simpler iterators, and new container constructors head the list of handy new featuresThis is the first of a three-part on what's new and important in 阅读全文
posted @ 2011-07-20 14:06 Lunaa 阅读(113) 评论(0) 推荐(0) 编辑
摘要:段的分类 根据C语言的特点,每一个源程序生成的目标代码将包含源程序所需要表达的所有信息和功能。目标代码中各段生成情况如下:1.代码段(Code)代码段由程序中的各个函数产生,函数的每一个语句将最终经过编译和汇编生成二进制机器代码(具体生成哪种体系结构的机器代码由编译器决定)。· 顺序代码基本数学运算(+,-),逻辑运算(&&,||),位运算(&,|,^)等都属于顺序代码。· 选择代码if,if…else语句等将由编译器生成选择代码。· 循环代码while(),do…while()语句等将由编译器生成循环代码。对于一些较为复杂的数学运算如除法 阅读全文
posted @ 2011-07-20 09:32 Lunaa 阅读(140) 评论(0) 推荐(0) 编辑
摘要:段的分类 根据C语言的特点,每一个源程序生成的目标代码将包含源程序所需要表达的所有信息和功能。目标代码中各段生成情况如下:1.代码段(Code)代码段由程序中的各个函数产生,函数的每一个语句将最终经过编译和汇编生成二进制机器代码(具体生成哪种体系结构的机器代码由编译器决定)。· 顺序代码基本数学运算(+,-),逻辑运算(&&,||),位运算(&,|,^)等都属于顺序代码。· 选择代码if,if…else语句等将由编译器生成选择代码。· 循环代码while(),do…while()语句等将由编译器生成循环代码。对于一些较为复杂的数学运算如除法 阅读全文
posted @ 2011-07-20 09:32 Lunaa 阅读(214) 评论(0) 推荐(0) 编辑
摘要:常量字符串与存放在栈中的字符串是C语言面试中经常出现的问题,这可以考察面试者对于C语言数据存储的理解。我们通过几个例题来看看常量字符串与存放在栈中的字符串下面的程序有错误吗?为什么? void test1(){ char* str="hello word!"; str[0] = 'H'; printf(str) ;}有错误,因为"hello word!",是一个常量字符串,存放于只读的段中,是不可被修改的!向只读数据段写入数据会产生段错误,那么,我们怎么让这个程序合法呢?void test1(){ char str[]="hel 阅读全文
posted @ 2011-07-20 09:27 Lunaa 阅读(78) 评论(0) 推荐(0) 编辑
摘要:常量字符串与存放在栈中的字符串是C语言面试中经常出现的问题,这可以考察面试者对于C语言数据存储的理解。我们通过几个例题来看看常量字符串与存放在栈中的字符串下面的程序有错误吗?为什么? void test1(){ char* str="hello word!"; str[0] = 'H'; printf(str) ;}有错误,因为"hello word!",是一个常量字符串,存放于只读的段中,是不可被修改的!向只读数据段写入数据会产生段错误,那么,我们怎么让这个程序合法呢?void test1(){ char str[]="hel 阅读全文
posted @ 2011-07-20 09:27 Lunaa 阅读(121) 评论(0) 推荐(0) 编辑
摘要:by Linux 程序设计QUOTECanonical versus Non-Canonical ModesThe two problems are closely related. By default, terminal input is not made available to a program untilthe user presses Enter. In most cases, this is a benefit because it allows the user to correct typing mistakesusing Backspace or Delete. Only 阅读全文
posted @ 2011-07-19 10:17 Lunaa 阅读(166) 评论(0) 推荐(0) 编辑
摘要:by Linux 程序设计QUOTECanonical versus Non-Canonical ModesThe two problems are closely related. By default, terminal input is not made available to a program untilthe user presses Enter. In most cases, this is a benefit because it allows the user to correct typing mistakesusing Backspace or Delete. Only 阅读全文
posted @ 2011-07-19 10:17 Lunaa 阅读(389) 评论(0) 推荐(0) 编辑
摘要:成为掌握企业聘用趋势的人才企业聘用人才形态和方式跟随着时代不断地改变,这种聘用趋势的变化,一般来说都与社会的文化和变化具有相当程度的关联,光以面试的内容就可以看出这样的变化,以往是千篇一律穿着整齐的西装、抱持着紧张心情接受面试。现在有些企业会要求应聘者穿着轻便的服装来参加面试,从这样的变化中我们也可以看出企业真正需要的人才,同样也随着时代的不同有一定的变化。因此,你一定要详细分析本身的条件,然后透过掌握现在企业所需人才的变化趋势,寻找出本身的优点和企业人才聘用趋势相似的地方,最后再拟订出强化这个相似之处的战略,这个战略就是你成功就业的关键。当然,在企业需要人才上会因为每个企业的特性而有所不同, 阅读全文
posted @ 2011-07-19 10:11 Lunaa 阅读(81) 评论(0) 推荐(0) 编辑
摘要:成为掌握企业聘用趋势的人才企业聘用人才形态和方式跟随着时代不断地改变,这种聘用趋势的变化,一般来说都与社会的文化和变化具有相当程度的关联,光以面试的内容就可以看出这样的变化,以往是千篇一律穿着整齐的西装、抱持着紧张心情接受面试。现在有些企业会要求应聘者穿着轻便的服装来参加面试,从这样的变化中我们也可以看出企业真正需要的人才,同样也随着时代的不同有一定的变化。因此,你一定要详细分析本身的条件,然后透过掌握现在企业所需人才的变化趋势,寻找出本身的优点和企业人才聘用趋势相似的地方,最后再拟订出强化这个相似之处的战略,这个战略就是你成功就业的关键。当然,在企业需要人才上会因为每个企业的特性而有所不同, 阅读全文
posted @ 2011-07-19 10:11 Lunaa 阅读(86) 评论(0) 推荐(0) 编辑
摘要:一,用select#include#include #include #include #include void changemode(int);int kbhit(void);int main(void){int ch;changemode(1);while ( !kbhit()){putchar('.');}ch = getchar();printf("\nGot %c\n", ch);changemode(0);return 0;}void changemode(int dir){static struct termios oldt, newt;if 阅读全文
posted @ 2011-07-19 08:50 Lunaa 阅读(565) 评论(0) 推荐(0) 编辑
摘要:一,用select#include#include #include #include #include void changemode(int);int kbhit(void);int main(void){int ch;changemode(1);while ( !kbhit()){putchar('.');}ch = getchar();printf("\nGot %c\n", ch);changemode(0);return 0;}void changemode(int dir){static struct termios oldt, newt;if 阅读全文
posted @ 2011-07-19 08:50 Lunaa 阅读(484) 评论(0) 推荐(0) 编辑
摘要:stdin和STDIN_FILENO的区别在unix系统调用中,标准输入描述字用stdin,标准输出用stdout,标准出错用stderr表示,但在一些调用函数,引用了STDIN_FILENO表示标准输入才,同样,标准出入用STDOUT_FILENO,标准出错用STDERR_FILENO.请问,他们有什么区别吗?stdin等是FILE *类型,属于标准I/O,在。STDIN_FILENO等是文件描述符,是非负整数,一般定义为0, 1, 2,属于没有buffer的I/O,直接调用系统调用,在。 阅读全文
posted @ 2011-07-19 08:50 Lunaa 阅读(78) 评论(0) 推荐(0) 编辑
摘要:stdin和STDIN_FILENO的区别在unix系统调用中,标准输入描述字用stdin,标准输出用stdout,标准出错用stderr表示,但在一些调用函数,引用了STDIN_FILENO表示标准输入才,同样,标准出入用STDOUT_FILENO,标准出错用STDERR_FILENO.请问,他们有什么区别吗?stdin等是FILE *类型,属于标准I/O,在。STDIN_FILENO等是文件描述符,是非负整数,一般定义为0, 1, 2,属于没有buffer的I/O,直接调用系统调用,在。 阅读全文
posted @ 2011-07-19 08:50 Lunaa 阅读(127) 评论(0) 推荐(0) 编辑
摘要:STOP! Bitfields 与对齐 alignCPU访问内 存时,总是以其整数字长为单位读写。比如 x86 CPU总是从4字节的整数倍数地址上,读取4字节数据,它不能随心所欲地从任何位置开始读取任意长度数据。为了效率考虑,默认情况下编译器总是让整数存放于其长度的整数 倍数地址上。在一个结构中,为了做到这一点,有时不得不浪费几个字节。举个例子,我 们定义一个结构:struct { char c; int i;};从字面上看, 这个结构的长度是5个字 节,但默认情况下编译器总是分配8个字节,是为了让 i出现在偏移量 4 地址上。位域 bitfields是 C 语言结构中的一个成员,... 阅读全文
posted @ 2011-07-18 22:32 Lunaa 阅读(192) 评论(0) 推荐(0) 编辑
摘要:STOP! Bitfields 与对齐 alignCPU访问内 存时,总是以其整数字长为单位读写。比如 x86 CPU总是从4字节的整数倍数地址上,读取4字节数据,它不能随心所欲地从任何位置开始读取任意长度数据。为了效率考虑,默认情况下编译器总是让整数存放于其长度的整数 倍数地址上。在一个结构中,为了做到这一点,有时不得不浪费几个字节。举个例子,我 们定义一个结构:struct { char c; int i;};从字面上看, 这个结构的长度是5个字 节,但默认情况下编译器总是分配8个字节,是为了让 i出现在偏移量 4 地址上。位域 bitfields是 C 语言结构中的一个成员,... 阅读全文
posted @ 2011-07-18 22:32 Lunaa 阅读(322) 评论(0) 推荐(0) 编辑
摘要:网上有文章说C语言的“位域”(bit fields)有可移植性的问题,原因是不同的编译器对位域的实现不同。 我决定用实验验证一下。 一、 实验过程: 1. 准备实验程序 这 是谭浩强C语言课本上第12章12.2节的位域示例程序: main() { struct bs { unsigned a:1; unsigned b:3; unsigned c:4; } bit,*pbit; bit.a = 1; bit.b = 7; bit.c = 15; printf("%d,%d,%d\n", bit.a, bit.b, bit.c); pbit ... 阅读全文
posted @ 2011-07-18 22:20 Lunaa 阅读(342) 评论(0) 推荐(0) 编辑
摘要:网上有文章说C语言的“位域”(bit fields)有可移植性的问题,原因是不同的编译器对位域的实现不同。 我决定用实验验证一下。 一、 实验过程: 1. 准备实验程序 这 是谭浩强C语言课本上第12章12.2节的位域示例程序: main() { struct bs { unsigned a:1; unsigned b:3; unsigned c:4; } bit,*pbit; bit.a = 1; bit.b = 7; bit.c = 15; printf("%d,%d,%d\n", bit.a, bit.b, bit.c); pbit ... 阅读全文
posted @ 2011-07-18 22:20 Lunaa 阅读(166) 评论(0) 推荐(0) 编辑
摘要:BIG Endian 和 Small Endian模式的区别谈到字节序的问题,必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。那么究竟什么是big endian,什么又是little endian呢?其实big endian是指低地址存放最高有效字节(MSB),而little endian则是低地址存放最低有效字节(LSB)。用文字说明可能比较抽象,下面用图像加以说明。比如数字0x12345678在两种不同字节序CPU中的存 阅读全文
posted @ 2011-07-18 22:19 Lunaa 阅读(151) 评论(0) 推荐(0) 编辑
摘要:BIG Endian 和 Small Endian模式的区别谈到字节序的问题,必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。那么究竟什么是big endian,什么又是little endian呢?其实big endian是指低地址存放最高有效字节(MSB),而little endian则是低地址存放最低有效字节(LSB)。用文字说明可能比较抽象,下面用图像加以说明。比如数字0x12345678在两种不同字节序CPU中的存 阅读全文
posted @ 2011-07-18 22:19 Lunaa 阅读(103) 评论(0) 推荐(0) 编辑
摘要:头文件和中说明了基础数据的长度。float,double和long double的范围就是在IEEE 754标准中提及的典型数据。关键字位长(字节)范围格式化字符串char1-128..127(或0..255,与体系结构相关)%cunsigned char10..255signed char1-128..127int2(16位系统) 或4-32768..32767 或-2147483648..2147483647%i, %dunsigned int2 或40..65535 或0..4294967295%usigned int2 或4-32768..32767 或-2147483648..214 阅读全文
posted @ 2011-07-18 22:18 Lunaa 阅读(115) 评论(0) 推荐(0) 编辑
摘要:头文件和中说明了基础数据的长度。float,double和long double的范围就是在IEEE 754标准中提及的典型数据。关键字位长(字节)范围格式化字符串char1-128..127(或0..255,与体系结构相关)%cunsigned char10..255signed char1-128..127int2(16位系统) 或4-32768..32767 或-2147483648..2147483647%i, %dunsigned int2 或40..65535 或0..4294967295%usigned int2 或4-32768..32767 或-2147483648..214 阅读全文
posted @ 2011-07-18 22:18 Lunaa 阅读(129) 评论(0) 推荐(0) 编辑
摘要:c++ 虚函数机制 效率问题1,多一次查虚表过程2,虚函数 效率低 是因为 执行过程中会跳转两次(首先找到对象的函数表,其次通过该函数表中存的虚函数表地址找到真正的执行地址),这样CPU运行的时候会跳转两次,而普通函数只跳一次。CPU每跳转一次,预取指令基本上就要作废很多,所以效率会很低。”/////////////////////////////////////最后得分者和流水线相关是说得通的,究其原因还是因为存在动态跳转,这会导致分支预测失败,流水线排空。 设想一下,如果说不是虚函数,那么在编译时期,其相对地址是确定的,编译器可以直接生成jmp/invoke指令; 如果是虚函数,多出来的一 阅读全文
posted @ 2011-07-17 14:30 Lunaa 阅读(444) 评论(0) 推荐(0) 编辑
摘要:分支指令预测技术 1.分支指令预测 在程序中一般都包含有分支转移指令,据统计,平均每七条指令中就有一条是分支转移指令.在指令流水线结构中,对于分支转移指令相当敏感。假设在80486 的指令流水线中的第一条指令已进入到译码阶段,而第二条指令已进入到提取阶段(准备进入译码器),如果发现第一条指令是分支指令(如跳转到某个地址),则指令预取队列中下一条及下下条等指令预取无效。这时(确切地说,等到第一条指令执行期间形成了分支的目标地址),需从目标地址中现取指令,并交付执行,同时应立即清除指令预取队列,再将目标地址后面的指令预取过来填到队列中。这表明,一遇到分支指令,整个指令流水线就被打乱一次,稍后才能恢 阅读全文
posted @ 2011-07-17 14:29 Lunaa 阅读(163) 评论(0) 推荐(0) 编辑
摘要:分支指令预测技术 1.分支指令预测 在程序中一般都包含有分支转移指令,据统计,平均每七条指令中就有一条是分支转移指令.在指令流水线结构中,对于分支转移指令相当敏感。假设在80486 的指令流水线中的第一条指令已进入到译码阶段,而第二条指令已进入到提取阶段(准备进入译码器),如果发现第一条指令是分支指令(如跳转到某个地址),则指令预取队列中下一条及下下条等指令预取无效。这时(确切地说,等到第一条指令执行期间形成了分支的目标地址),需从目标地址中现取指令,并交付执行,同时应立即清除指令预取队列,再将目标地址后面的指令预取过来填到队列中。这表明,一遇到分支指令,整个指令流水线就被打乱一次,稍后才能恢 阅读全文
posted @ 2011-07-17 14:29 Lunaa 阅读(792) 评论(0) 推荐(0) 编辑
摘要:对于CPU来说,它的工作可分为获取指令、解码、运算、结果几个步骤。其中前两步由指令控制器完成,后两步则由运算器完成。按照传统的方式,所有指令按顺序执行,先由指令控制器工作,完成一条指令的前两步,然后运算器工作,完成后两步,依此类推……很明显,当指令控制器工作时运算器基本上处于闲置状态,当运算器在工作时指令控制器又在休息,这样就造成了相当大的资源浪费。于是CPU借鉴了工业生产中被广泛应用的流水线设计,当指令控制器完成了第一条指令的前两步后,直接开始第二条指令的操作,运算器单元也是,这样就形成了流水线。流水线设计可最大限度地利用了 CPU资源,使每个部件在每个时钟周期都在工作,从而提高了CPU的运 阅读全文
posted @ 2011-07-17 14:19 Lunaa 阅读(173) 评论(0) 推荐(0) 编辑
摘要:对于CPU来说,它的工作可分为获取指令、解码、运算、结果几个步骤。其中前两步由指令控制器完成,后两步则由运算器完成。按照传统的方式,所有指令按顺序执行,先由指令控制器工作,完成一条指令的前两步,然后运算器工作,完成后两步,依此类推……很明显,当指令控制器工作时运算器基本上处于闲置状态,当运算器在工作时指令控制器又在休息,这样就造成了相当大的资源浪费。于是CPU借鉴了工业生产中被广泛应用的流水线设计,当指令控制器完成了第一条指令的前两步后,直接开始第二条指令的操作,运算器单元也是,这样就形成了流水线。流水线设计可最大限度地利用了 CPU资源,使每个部件在每个时钟周期都在工作,从而提高了CPU的运 阅读全文
posted @ 2011-07-17 14:19 Lunaa 阅读(135) 评论(0) 推荐(0) 编辑
摘要:为什么Intel处理器主频这么高,而AMD处理器主频都很低?是不是AMD处理器性能不如Intel?我们一般的回答都是,因为Intel处理器与AMD处理器内部构架不同,所以导致了这种情况,还有一种具体一点的回答就是因为Intel处理器流水线长,那到底流水线与CPU主频具体有什么关系呢?今天给大家带来一篇我以前刊登在《电脑报》硬件板块技术大讲堂版面的一篇原创文章。关于CPU流水线的知识,很多报纸杂志都介绍过了,但以往的很多文章对某些问题的解释不够清楚,比如报纸杂志上曾多次提及增加流水线级数有利于提高CPU主频,但对其原因的解释却少有触及,又比如对于流水线的级数与其周期的关系是什么?CPU流水线与工 阅读全文
posted @ 2011-07-17 14:17 Lunaa 阅读(844) 评论(0) 推荐(0) 编辑
摘要:为什么Intel处理器主频这么高,而AMD处理器主频都很低?是不是AMD处理器性能不如Intel?我们一般的回答都是,因为Intel处理器与AMD处理器内部构架不同,所以导致了这种情况,还有一种具体一点的回答就是因为Intel处理器流水线长,那到底流水线与CPU主频具体有什么关系呢?今天给大家带来一篇我以前刊登在《电脑报》硬件板块技术大讲堂版面的一篇原创文章。关于CPU流水线的知识,很多报纸杂志都介绍过了,但以往的很多文章对某些问题的解释不够清楚,比如报纸杂志上曾多次提及增加流水线级数有利于提高CPU主频,但对其原因的解释却少有触及,又比如对于流水线的级数与其周期的关系是什么?CPU流水线与工 阅读全文
posted @ 2011-07-17 14:17 Lunaa 阅读(1794) 评论(0) 推荐(0) 编辑
摘要:比如你用local在栈上定义了一个局部变量LocalVar,你知道实际的指令是什么么?一般都差不多像下面的样子: push ebp mov esp, ebp sub esp, 4 现在栈上就有了4各字节的空间,这就是你的局部变量。 接下来,你执行mov LocalVar, 4,那么实际的指令又是什么?是这样: mov dword ptr [ebp-4], 4 于是,这个局部变量的“地址”就是ebp-4——显然,它不是一个固定的地址。现在需要将它的“地址”作为参数传给某个函数,你这样写: invoke/call SomeFunc, addr LocalVar 实际生成的指令是: lea eax, 阅读全文
posted @ 2011-07-14 22:40 Lunaa 阅读(457) 评论(0) 推荐(0) 编辑
摘要:比如你用local在栈上定义了一个局部变量LocalVar,你知道实际的指令是什么么?一般都差不多像下面的样子: push ebp mov esp, ebp sub esp, 4 现在栈上就有了4各字节的空间,这就是你的局部变量。 接下来,你执行mov LocalVar, 4,那么实际的指令又是什么?是这样: mov dword ptr [ebp-4], 4 于是,这个局部变量的“地址”就是ebp-4——显然,它不是一个固定的地址。现在需要将它的“地址”作为参数传给某个函数,你这样写: invoke/call SomeFunc, addr LocalVar 实际生成的指令是: lea eax, 阅读全文
posted @ 2011-07-14 22:40 Lunaa 阅读(141) 评论(0) 推荐(0) 编辑
摘要:C++语言中经常会提到POD,就是plain old data的缩写。那么究竟什么是POD呢维基百科上的解释:http://en.wikipedia.org/wiki/Plain_Old_Data_StructuresA plain old data structure (POD) is a data structure that is represented only as passive collections of field values, without usingencapsulation or other object-oriented features.Plain old da 阅读全文
posted @ 2011-07-14 22:17 Lunaa 阅读(658) 评论(0) 推荐(0) 编辑
摘要:C++语言中经常会提到POD,就是plain old data的缩写。那么究竟什么是POD呢维基百科上的解释:http://en.wikipedia.org/wiki/Plain_Old_Data_StructuresA plain old data structure (POD) is a data structure that is represented only as passive collections of field values, without usingencapsulation or other object-oriented features.Plain old da 阅读全文
posted @ 2011-07-14 22:17 Lunaa 阅读(452) 评论(0) 推荐(0) 编辑
摘要:最近碰到个需求,计算游戏得分的规则,类似这样:游戏人数第一名获得赌注第二名获得赌注第三名获得赌注第四名获得赌注二人100%0%——二人(出现2个第1名时)50%50%三人70%30%0%—三人(出现3个第1名时)33.3333%33.3333%33.3333%三人(出现2个第1名时)50%×20%............这些奖励规则没有什么规律,随着人数增多,就越发复杂了,并且业务人员可能随时改变这些规则。显然,奖励规则可以采用策略模式,定义策略接口,根据游戏人数定义不同的规则,本质上就是利用动态的多态调用。可以想见,还是少不了复杂的case...when语句,以及繁多的代码。恰好最 阅读全文
posted @ 2011-07-13 20:57 Lunaa 阅读(103) 评论(0) 推荐(0) 编辑
摘要:最近碰到个需求,计算游戏得分的规则,类似这样:游戏人数第一名获得赌注第二名获得赌注第三名获得赌注第四名获得赌注二人100%0%——二人(出现2个第1名时)50%50%三人70%30%0%—三人(出现3个第1名时)33.3333%33.3333%33.3333%三人(出现2个第1名时)50%×20%............这些奖励规则没有什么规律,随着人数增多,就越发复杂了,并且业务人员可能随时改变这些规则。显然,奖励规则可以采用策略模式,定义策略接口,根据游戏人数定义不同的规则,本质上就是利用动态的多态调用。可以想见,还是少不了复杂的case...when语句,以及繁多的代码。恰好最 阅读全文
posted @ 2011-07-13 20:57 Lunaa 阅读(158) 评论(0) 推荐(0) 编辑
摘要:表驱动分为三种,分别是:直接索引、索引表、阶梯索引。一般直接索引使用比较广泛,也容易想到。今天在网上看到了一笔试题,统计一个字符串中第一次出现且频率最高的字符。看到这道题以后,我觉得使用表驱动能很快、很容易地解决问题,下面是我使用表驱动给出的解法。Java代码 public staticchar statMostRateChar(String str) { if (str != null && !"".equals(str)) {int charsStat[] = newint[128];int charsFirstIdx[] = new int[128]; 阅读全文
posted @ 2011-07-13 20:50 Lunaa 阅读(664) 评论(0) 推荐(0) 编辑
摘要:表驱动分为三种,分别是:直接索引、索引表、阶梯索引。一般直接索引使用比较广泛,也容易想到。今天在网上看到了一笔试题,统计一个字符串中第一次出现且频率最高的字符。看到这道题以后,我觉得使用表驱动能很快、很容易地解决问题,下面是我使用表驱动给出的解法。Java代码 public staticchar statMostRateChar(String str) { if (str != null && !"".equals(str)) {int charsStat[] = newint[128];int charsFirstIdx[] = new int[128]; 阅读全文
posted @ 2011-07-13 20:50 Lunaa 阅读(144) 评论(0) 推荐(0) 编辑
摘要:不知道从什么时候开始,switch-case语句成了代码坏味道的代名词,写代码的时候小心翼翼地避开它,看到别人代码中的switch-case就皱眉头,想想其实大可不必这样,switch-case语句并不是代码坏味道的根源,坏味道来自糟糕的代码(结构)设计,比如过多的switch-case分支,或者多重switch-case嵌套等等,这些都将导致代码可读性下降,如果再加上代码风格较差,代码不对齐,那么坏味道就相当地大了。简短的switch-case还是继续用吧,但是对于分支太多的长switch-case最好能想办法化解开,那么什么算长什么算短呢?我也不知道,就以在最低分辨率的显示器上能够在一个窗 阅读全文
posted @ 2011-07-13 20:43 Lunaa 阅读(229) 评论(0) 推荐(0) 编辑
摘要:不知道从什么时候开始,switch-case语句成了代码坏味道的代名词,写代码的时候小心翼翼地避开它,看到别人代码中的switch-case就皱眉头,想想其实大可不必这样,switch-case语句并不是代码坏味道的根源,坏味道来自糟糕的代码(结构)设计,比如过多的switch-case分支,或者多重switch-case嵌套等等,这些都将导致代码可读性下降,如果再加上代码风格较差,代码不对齐,那么坏味道就相当地大了。简短的switch-case还是继续用吧,但是对于分支太多的长switch-case最好能想办法化解开,那么什么算长什么算短呢?我也不知道,就以在最低分辨率的显示器上能够在一个窗 阅读全文
posted @ 2011-07-13 20:43 Lunaa 阅读(179) 评论(0) 推荐(0) 编辑
摘要:XML可扩展语言的发展2009-08-21XML介绍可扩展置标语言(eXtensible Markup Language,简称XML),又称可扩展标记语言,是一种置标语言。置标指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。如何定义这些标记,既可以选择国际通用的标记语言,比如HTML,也可以使用像XML这样由相关人士自由决定的标记语言,这就是语言的可扩展性。XML是从标准通用置标语言(SGML)中简化修改出来的。它主要用到的有可扩展置标语言、可扩展样式语言(XSL)、XBRL和XPath等。XML历史XML是从1995年开始有其雏形,并向W3C(万维网联盟)提 阅读全文
posted @ 2011-07-13 09:05 Lunaa 阅读(169) 评论(0) 推荐(0) 编辑
摘要:XML可扩展语言的发展2009-08-21XML介绍可扩展置标语言(eXtensible Markup Language,简称XML),又称可扩展标记语言,是一种置标语言。置标指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。如何定义这些标记,既可以选择国际通用的标记语言,比如HTML,也可以使用像XML这样由相关人士自由决定的标记语言,这就是语言的可扩展性。XML是从标准通用置标语言(SGML)中简化修改出来的。它主要用到的有可扩展置标语言、可扩展样式语言(XSL)、XBRL和XPath等。XML历史XML是从1995年开始有其雏形,并向W3C(万维网联盟)提 阅读全文
posted @ 2011-07-13 09:05 Lunaa 阅读(188) 评论(0) 推荐(0) 编辑
摘要:XML的优势及应用领域XML探讨XML的优点我们在介绍XML基本概念时已经提到了XML语言的诸多优点,这里更加具体系统地总结XML的优点,列举如下:1)XML文档的内容和结构完全分离这个特性为XML的应用带来了很大的好处。基于这样的特点,企业系统可以轻松地实现内容管理和流程管理的彻底分离,例如系统架构师可以只关注流程运转中各环节的接口定义,而各部门则可以专注在内容发布和维护之上。举例来说,微软公司的产品Biztalk正是利用了XML内容和结构分离的特点来实现内容和流程定义的分离。另外一个广泛的应用是XSL技术,由于XML文件的内容和结构分离,XSL才可以在不影响内容的情况下改变XML文件结构。 阅读全文
posted @ 2011-07-12 23:03 Lunaa 阅读(125) 评论(0) 推荐(0) 编辑
摘要:XML的优势及应用领域XML探讨XML的优点我们在介绍XML基本概念时已经提到了XML语言的诸多优点,这里更加具体系统地总结XML的优点,列举如下:1)XML文档的内容和结构完全分离这个特性为XML的应用带来了很大的好处。基于这样的特点,企业系统可以轻松地实现内容管理和流程管理的彻底分离,例如系统架构师可以只关注流程运转中各环节的接口定义,而各部门则可以专注在内容发布和维护之上。举例来说,微软公司的产品Biztalk正是利用了XML内容和结构分离的特点来实现内容和流程定义的分离。另外一个广泛的应用是XSL技术,由于XML文件的内容和结构分离,XSL才可以在不影响内容的情况下改变XML文件结构。 阅读全文
posted @ 2011-07-12 23:03 Lunaa 阅读(595) 评论(0) 推荐(0) 编辑
摘要:XML的优点 XML作为一种数据格式有更多的优点[5]: u 开放性 XML得以成功的主要因素之一就是他的基于规范和标准的开放性。XML技术根据标准规范,允许在任何平台上读取和处理数据。更重要的是XML允许通过HTTP和其他传输协议交换XML数据。 u 简单性 XML另外一个非常重要的优点就是他的简单性。XML文档只是纯文本。这样XML文档就可以自由的在两个不同的系统之间交换数据,因为基本上任何系统都提供了对文本格式的支持。 u 自我描述性 XML可以明确地表示数据模型中各个部分的意义,这就是自我描述性。 只要查看XML文档就能确定该数据的意义。同时,X... 阅读全文
posted @ 2011-07-12 23:01 Lunaa 阅读(602) 评论(0) 推荐(0) 编辑
摘要:使用XML的五种场合主 题: 使用XML的五种场合[精华] 作 者: ChinaOk (蓝蝶[授人以鱼,不如授人以渔]) 等 级: 信 誉 值: 103 所属论坛: XML/SOAP 问题点数: 1 回复次数: 76 发表时间: 2002-4-8 16:54:32 在很多研讨会和培训班上我遇到过许多人,他们还不明白为什么要使用XML也不知道如何 在他们的应用中使用XML。一些来自诸如Gartner公司的报告建议说,商业公司不能再做 局外人了,不能对XML置之不理。如果你还不清楚XML到底有什么好处的话,你并不是唯 一的人。 我决定把与人们和媒体关于XML话题的交谈整理成文,列出XML在应... 阅读全文
posted @ 2011-07-12 22:51 Lunaa 阅读(96) 评论(0) 推荐(0) 编辑
摘要:[译文]Protocol Buffers:Google 的数据交换格式Jul 09北极程序设计Open Source,Protocol Buffers2 Comments×原文地址:Protocol Buffers: Google’s Data Interchange Format本文地址:http://migege.com/archives/protocol-buffers-googles-data.html由 北极冰仔 翻译,转载请以超级链接的形式注明本文地址。在 Google,我们的任务是将全世界的所有信息进行组织。毫不夸张地,我们使用成千上万种不同的数据格式来描述服务器之间的 阅读全文
posted @ 2011-07-12 22:47 Lunaa 阅读(134) 评论(0) 推荐(0) 编辑
摘要:Boost.Asio和ACE之间关于Socket编程的比较ACE是一个很成熟的中间件产品,为自适应通讯环境,但它过于宏大,一堆的设计模式,架构是一层又一层,对初学者来说,有点困难。ASIO是基本Boost开发的异步IO库,封装了Socket,简化基于socket程序的开发。 最近分析ASIO的源代码,让我无不惊呀于它设计。在ACE中开发中的内存管理一直让人头痛,ASIO的出现,让我看到新的曙光,成为我新的好伙伴。简单地与ACE做个比较。boost::asio是一个高性能的网络开发库,Windows下使用IOCP,Linux下使用epoll。与ACE不同的是,它并没有提供一个网络框架,而是采取组 阅读全文
posted @ 2011-07-09 21:42 Lunaa 阅读(110) 评论(0) 推荐(0) 编辑
摘要:对象生死劫 - 构造函数和析构函数的异常构造函数和析构函数分别管理对象的建立和释放,负责对象的诞生和死亡的过程。当一个对象诞生时,构造函数负责创建并初始化对象的内部环境,包括分配内存、创建内部对象和打开相关的外部资源,等等。而当对象死亡时,析构函数负责关闭资源、释放内部的对象和已分配的内存。在对象生死攸关的地方,如果程序代码出现问题,常常会发生内存泄漏,从而产生可能危害系统运行的孤魂野鬼。大量的事实表明,业务逻辑代码写得非常严谨的程序在运行中仍然发现存在内存泄露,大都是构造和析构部分的代码存在问题。而许多程序员都习惯于面向对象的编程,需要时就建立一个对象,不用时就将其释放。这样的习惯简化了我们 阅读全文
posted @ 2011-07-08 12:36 Lunaa 阅读(132) 评论(0) 推荐(0) 编辑
摘要:第17条: 要在单独的语句中使用智能指针来存储由new创建的对象假设这里有一个函数用来显示处理优先级,另一个函数根据当前优先级为一个动态分配的 Widget 做一些处理: int priority(); void processWidget(std::tr1::shared_ptr pw, int priority); 一定要时刻记住“使用对象管理资源”这一真理(参见第 13 条)。 processWidget 中可以使用智能指针来动态分配其需要处理的 Widget 。 下面是对 progressWidget 的一次调用: processWidget(new Widget, priority( 阅读全文
posted @ 2011-07-03 13:26 Lunaa 阅读(147) 评论(0) 推荐(0) 编辑
摘要:Boost智能指针——shared_ptrboost::scoped_ptr虽然简单易用,但它不能共享所有权的特性却大大限制了其使用范围,而boost::shared_ptr可以解决这一局限。顾名思义,boost::shared_ptr是可以共享所有权的智能指针,首先让我们通过一个例子看看它的基本用法:#include#include #include class implementation{public:~implementation() { std::cout sp1(new implementation());std::cout sp2 = sp1;std::cout(new imp. 阅读全文
posted @ 2011-07-03 12:14 Lunaa 阅读(142) 评论(0) 推荐(0) 编辑
摘要:Boost智能指针——weak_ptr循环引用: 引用计数是一种便利的内存管理机制,但它有一个很大的缺点,那就是不能管理循环引用的对象。一个简单的例子如下: #include #include #include #include class parent;class children;typedef boost::shared_ptr parent_ptr;typedef boost::shared_ptr children_ptr;class parent{public:~parent() { std::cout children = son;son->parent = father; 阅读全文
posted @ 2011-07-03 11:48 Lunaa 阅读(102) 评论(0) 推荐(0) 编辑