自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(69)
  • 收藏
  • 关注

原创 [利用asm代码学习c++语法]--stl、模版

在vs2005下建立vc++的win32 控制台应用程序,设置stdafx.h不必要包含,设置多字符集,设置汇编输出/FAs。代码和asm解析如下:实际产生9500多行asm代码,只取main函数直接对应的代码和模版函数实例化后编译获得的asm代码,间接代码省略。#include #include templateT max_test(T &t1, T &t2){ return (t1 >

2007-05-26 18:46:00 920

原创 [利用asm代码学习c++语法]--异常、数组初始化

在vs2005下建立vc++的win32 控制台应用程序,设置stdafx.h不必要包含,设置多字符集,设置汇编输出/FAs。代码和asm解析如下:#include static int randSeed = 0;void srand_test(int seed){ randSeed = seed;}int rand_test(void){ randSeed = (69069 * randSe

2007-05-26 18:10:00 1417

原创 [利用asm代码学习c++语法]--enum

明天接着贴,有些似乎可以实际做事的时候再看,因为大同小异:asm下除了地址、整型值、浮点值、栈、寄存器、标志位、指令集等等概念,似乎没有什么(实际写起来还是麻烦,俺也只是看得懂一点,为了学c/c++/win32api等才看看)。c++语法仅仅是对机器指令进行了高层的封装,从而方便用户表达某些思想,但同时给用户造成了一些误解,使得我们容易在使用c++时忽略了各种不同语句背后的不同成本开销。实

2007-05-25 22:46:00 1130

原创 [利用asm代码学习c++语法]--类、private、protected、public、自定义结构体

在vs2005下建立vc++的win32 控制台应用程序,设置stdafx.h不必要包含,设置多字符集,设置汇编输出/FAs。代码和asm解析如下:#include struct X{ int i,j,k;//0,4,8,12};class XXX{public: int ipub;//0 X xpub;//4 int ipub3;//16protected: int ipro;//20 X

2007-05-25 22:15:00 1299

原创 [利用asm代码学习c++语法]--两种字符数组、指针、指针转换

在vs2005下建立vc++的win32 控制台应用程序,设置stdafx.h不必要包含,设置多字符集,设置汇编输出/FAs。代码和asm解析如下:#include int main(int argc, char* argv[]){ char c[] = "ABC"; char *p = c; long *i = (long*)p; *i += 0x202020; printf("%s/n",

2007-05-25 21:37:00 1277

原创 [利用asm代码学习c++语法]--常量、变量、算术、for循环

在vs2005下建立vc++的win32 控制台应用程序,设置stdafx.h不必要包含,设置多字符集,设置汇编输出/FAs。代码和asm解析如下:#include int main(int argc, char* argv[]){ char c = C; int i = 9; double d(0.1); for(; i%2; --i)  d += c; printf("%f/n", d

2007-05-25 21:11:00 1028

原创 [利用asm代码学习c++语法]--union、位域、switch、构造函数

在vs2005下建立vc++的win32 控制台应用程序,设置stdafx.h不必要包含,设置多字符集,设置汇编输出/FAs。代码和asm解析如下:#include union XXX{ struct {  unsigned int H:4;  unsigned int G:7;  unsigned int F:6;  unsigned int E:5;  unsigned int D:4; 

2007-05-23 23:13:00 1243

原创 [利用asm代码学习c++语法]--hello world程序

在vs2005下建立vc++的win32 控制台应用程序,设置stdafx.h不必要包含,设置多字符集,设置汇编输出/FAs。编写代码如下:#include int main(int argc, char* argv[]){ printf("hello world!/n"); return 0;}对应的汇编输出为:; Listing generated by Microsoft (R)

2007-05-23 22:41:00 1516

原创 程序设计与关系数据库理论

这几天想着如何设计一个工程,虽然自己感觉已经比较清楚了,程序结构和ui方面的框架已经搭建,但是数据处理的代码还是不知道如何描述。今天反思了一下,觉得原因出在没有将经验、想法转化为理论化、量化、数学化的言语,于是考虑如何将想法用严谨完备的语言描述出来,而且用相关理论来证明设计是完备、灵活的。重新反思我对业务问题的理解后,我觉得用关系数据库的关系、操作集、对象、索引、集合双向映射等等概念可以比较清

2007-04-13 20:46:00 601

原创 Dijkstra最短路径算法初探

数据源:一组顶点Vi(i=1~n),顶点间通路(Vi, Vj), 通路的距离dis(i,j)。 目标:任意给定一组起点s, 终点d, 计算s==》d之间的最短距离, 并给出通路。 算法输入数据举例如下:4            //四个顶点4            //四个通路1 2 4      //顶点1到顶点2存在距离为4的通路1 3 5      /

2006-12-03 20:38:00 2455

原创 学习笔记:pe文件格式、pe部分信息解析程序代码(win32asm)

 一:PE整体结构PE 的意思就是Portable Executable(可移植的执行体)。PE文件的整体大概结构描述:struct pe{DOS MZ header:所有PE文件(甚至32位的DLLs) 必须以一个简单的DOS MZ header 开始。有了它,一旦程序在DOS下执行,DOS就能识别出这是有效的执行体,然后运行紧随MZ header 之后的DOS stub

2006-11-25 22:08:00 2739

原创 学习笔记:vc下c++与asm混合编程--hello world程序

#include int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd){ HWND hWnd = NULL;    LPCSTR lpText = "hello world!";    LPCSTR lpCaption = lpText; UINT uTyp

2006-11-13 22:25:00 1058

原创 学习笔记:一个win32asm简单的带控件对话框程序及较详细注释

;一共四个文件:;.asm  masm代码,调用ml编译;.rc   资源文件,调用rc编译;makefile  makefile文件,被nmake解释,它调用ml、rc、link;make.bat 设置环境,并调用nmake;编译条件及方法:;安装vc、masm、必要的话将nmake、rc等程序拷到masm的相应目录(参见bat文件);运行make.bat编译链接就会得到可执行程序;;make.

2006-11-13 22:05:00 1053

原创 学习笔记:一个win32asm文本绘制程序及较详细注释

建议用radasm编译运行。.386.model flat,stdcalloption casemap:noneinclude   windows.incinclude   user32.incincludelib   user32.libinclude   kernel32.incincludelib   kernel32.lib include   gdi32.inc includel

2006-11-13 22:00:00 827

原创 学习笔记:win32asm的一个简单程序及注释

以前的学习笔记 。可以根据注释拆开分成多个文件编译,或者用radasm等asm ide编译。.386                                ;使用80386指令集.MODEL Flat, STDCALL                ;指定内存模式,参数的传递约定option casemap:none                 ;告诉 MASM 要区分标号的大小写

2006-11-13 21:53:00 1085

原创 学习笔记:一个简单的win32程序和复杂的背景知识

/*一个简单的win32程序。1.用vc6创建一个win32 application,因为dsp文件不太好写,接受vc6的帮助是无奈的选择,当然也可以研究一下。2.添加一个cpp文件到工程,因为vc6一般都是编译cpp文件生成程序。3.写代码,编译,调试...*/#include   //此头文件定义了一些宏、包含了一些必要头文件,如果不要它,该如何写?//函数声明BOOL InitWin

2006-11-08 23:29:00 1212

原创 学习笔记-Effective STL-使用STL编程

条款43:尽量用算法调用代替手写循环有三个理由:效率:算法通常比程序员产生的循环更高效。 正确性:写循环时比调用算法更容易产生错误。 可维护性:算法通常使代码比相应的显式循环更干净、更直观。 条款44:尽量用成员函数代替同名的算法存在既是道理。条款45:注意count、find、binary_search、lower_bound、upper_bound和equal_ra

2006-11-02 22:52:00 889

原创 学习笔记-Effective STL-仿函数、仿函数类、函数等

条款38:把仿函数类设计为用于值传递函数指针是值传递。STL中的习惯是当传给函数和从函数返回时函数对象也是值传递的。这暗示了两个东西。第一,你的函数对象应该很小。否则它们的拷贝会很昂贵。第二,你的函数对象必须单态(也就是,非多态)——它们不能用虚函数。条款39:用纯函数做判断式判断式是返回bool。纯函数是返回值只依赖于参数的函数。如果f是一个纯函数,x和y是对象,f(x, y)的返回

2006-11-02 22:37:00 1446

原创 学习笔记-Effective STL-算法

条款30:确保目标区间足够大results.reserve(results.size() + values.size());transform(values.begin(), values.end(),back_inserter(results),transmogrify);在内部,back_inserter返回的迭代器会调用push_back,所以你可以在任何提供push_bac

2006-11-02 22:10:00 736

原创 学习笔记-Effective STL-迭代器

 条款26:尽量用iterator代替const_iterator,reverse_iterator和const_reverse_iterator    如果你尽量使用iterator代替const或reverse类型的迭代器,可以使得容器的使用更简单,更高效而且可以避免潜在的bug。条款27:用distance和advance把const_iterator转化成iterator 

2006-11-02 21:40:00 674

原创 学习笔记-Effective STL-关联容器

 条款19:了解相等和等价的区别       操作上来说,相等的概念是基于operator==的。如果表达式“x == y”返回true,x和y有相等的值,否则它们没有。等价是基于在一个有序区间中对象值的相对位置。两个对象x和y如果在关联容器c的排序顺序中没有哪个排在另一个之前,那么它们关于c使用的排序顺序有等价的值。!(w1 !(w2要完全领会相等和等价的含义,考虑一个忽略大小写的se

2006-11-01 22:37:00 739

原创 学习笔记-Effective STL-vector和string

条款13:尽量使用vector和string来代替动态分配的数组       原因是简单省事。条款14:使用reserve来避免不必要的重新分配       避免不必要的内存重新分配。条款15:小心string实现的多样性       字符串值可能是或可能不是引用计数的。 string对象的大小可能从1到至少7倍char*指针的大小。 新字符串值的建立可能需要0、1或2

2006-10-31 22:04:00 663

原创 学习笔记-Effective STL-容器

 条款1:仔细选择你的容器了解各种容器的实现方法,知道各种容器的内存管理方式、各种操作所对应的底层操作,然后根据需要选择恰当的容器。条款2:小心对“容器无关代码”的幻想       各种容器支持的操作集合不同、各容器相同操作的特性不同。条款3:使容器里对象的拷贝操作轻量而正确       一个使拷贝更高效、正确而且对分割问题免疫的简单的方式是建立指针的容器而不是对象的容器。

2006-10-31 21:45:00 766

原创 编程交流与学习--More Effective C++的学习-Item M35:让自己习惯使用标准C++语言

ISO/ANSI C++标准是厂商实现编译器时将要考虑的,是作者们准备出书时将要分析的,是程序员们在对C++发生疑问时用来寻找权威答案的。C++的这些变化在标准运行库的变化面前将黯然失色。此外,标准运行库的演变从没象语言本身这样被宣扬过。例如,《The Design and Evolution of C++》几乎没有提及标准运行库。讨论运行库的书籍都有些过时,因为运行库在1994年后发生了非常

2006-10-30 22:17:00 733

原创 编程交流与学习--More Effective C++的学习-Item M34:如何在同一程序中混合使用C++和C

在实体混合编程前,确保你的C++编译器和C编译器兼容。确认兼容后,还有四个要考虑的问题:名变换,静态初始化,内存动态分配,数据结构兼容。l        名变换名变换,就是C++编译器给程序的每个函数换一个独一无二的名字。在C中,这个过程是不需要的,因为没有函数重载,但几乎所有C++程序都有函数重名(例如,流运行库就申明了几个版本的operator和operator>>)。重载不兼容于

2006-10-30 22:06:00 694

原创 编程交流与学习--More Effective C++的学习-Item M33:将非尾端类设计为抽象类

class AbstractAnimal {protected:  AbstractAnimal& operator=(const AbstractAnimal& rhs);public:  virtual ~AbstractAnimal() = 0;                     // see below  ...};class Animal: public

2006-10-30 21:53:00 681

原创 编程交流与学习--More Effective C++的学习-Item M32:在未来时态下开发程序

好的软件能够适应变化。它提供新的特性,适应到新的平台,满足新的需求,处理新的输入。新的函数将被加入到函数库中,新的重载将发生,于是要注意那些含糊的函数调用行为的结果;新的类将会加入继承层次,现在的派生类将会是以后的基类,并已为此作好准备;将会编制新的应用软件,函数将在新的运行环境下被调用,它们应该被写得在新平台上运行正确;程序的维护人员通常不是原来编写它们的人,因此应该被设计得易于被别人理解、

2006-10-30 21:46:00 602

原创 编程交流与学习--More Effective C++的学习-Item M31:让函数根据一个以上的对象来决定怎么虚拟

一种作用在多个对象上的虚函数。C++没有提供这样的函数,现在怎么办呢?一种办法是扔掉C++,换种其它语言。比如,你可以改用CLOS(Common Lisp Object System)。CLOS支持绝大部分面向对象的函数调用体系中只能想象的东西:multi-method。multi-method是在任意多的参数上虚拟的函数,并且CLOS更进一步的提供了明确控制“被重载的multi-method

2006-10-30 21:36:00 705

原创 编程交流与学习--More Effective C++的学习-Item M30:代理类

 l        实现二维数组templateclass Array2D {public: class Array1D { public:    T& operator[](int index);    const T& operator[](int index) const;    ... }; Array1D operator[](int inde

2006-10-30 21:18:00 764

原创 编程交流与学习--More Effective C++的学习-Item M29:引用计数

引用计数是这样一个技巧,它允许多个有相同值的对象共享这个值的实现。引用计数是个简单的垃圾回收体系。l        实现引用计数class String {public:  ...   // the usual String member functions go hereprivate:  struct StringValue { ... }; // holds a re

2006-10-26 22:29:00 775

原创 编程交流与学习--More Effective C++的学习-Item M28:灵巧(smart)指针

Item M28:灵巧(smart)指针Stl源代码如下:templateclass auto_ptr {public:typedef _Ty element_type;explicit auto_ptr(_Ty *_P = 0) _THROW0()    : _Owns(_P != 0), _Ptr(_P) {}auto_ptr(const auto_ptr& _

2006-10-26 22:14:00 599

原创 编程交流与学习--More Effective C++的学习-Item M27:要求或禁止在堆中产生对象

 l         要求在堆中建立对象让析构函数成为private,让构造函数成为public。异常处理体系要求所有在栈中的对象的析构函数必须申明为公有.这种方法也禁止了继承和包容(containment).这些困难不是不能克服的。通过把UPNumber的析构函数声明为protected(同时它的构造函数还保持public)就可以解决继承的问题,需要包含UPNumber对象的类可以修

2006-10-26 22:04:00 674

原创 编程交流与学习--More Effective C++的学习-Item M26:限制某个类所能产生的对象数量

以下为摘要(本章后面不知所云):阻止建立某个类的对象,最容易的方法就是把该类的构造函数声明在类的private域。    class Printer {public:  static Printer& thePrinter();  ...private:  Printer();  Printer(const Printer& rhs);  ... };P

2006-10-24 22:30:00 668

原创 编程交流与学习--More Effective C++的学习-Item M25:将构造函数和非成员函数虚拟化

虚拟构造函数是指能够根据输入给它的数据的不同而建立不同类型的对象。虚拟构造函数在很多场合下都有用处,从磁盘(或者通过网络连接,或者从磁带机上)读取对象信息只是其中的一个应用。(WQ加注:readComponent()的实现可详见《汤姆.斯旺C++编程秘诀》)    还有一种特殊种类的虚拟构造函数――虚拟拷贝构造函数――也有着广泛的用途。虚拟拷贝构造函数能返回一个指针,指向调用该函数的对象的新拷

2006-10-24 21:55:00 659

原创 编程交流与学习--More Effective C++的学习-Item M23:考虑变更程序库

程序库的设计就是一个折衷的过程。理想的程序库应该是短小的、快速的、强大的、灵活的、可扩展的、直观的、普遍适用的、具有良好的支持、没有使用约束、没有错误的。这也是不存在的。为尺寸和速度而进行优化的程序库一般不能被移植。具有大量功能的的程序库不会具有直观性。没有错误的程序库在使用范围上会有限制。真实的世界里,你不能拥有每一件东西,总得有付出。    不同的设计者给这些条件赋予了不同的优先级。他们从

2006-10-24 21:31:00 566

原创 编程交流与学习--More Effective C++的学习-Item M24:理解虚拟函数、多继承、虚基类和RTTI所需的代价

 Item M24:理解虚拟函数、多继承、虚基类和RTTI所需的代价当调用一个虚拟函数时,被执行的代码必须与调用函数的对象的动态类型相一致;大多数编译器是使用virtual table和virtual table pointers。virtual table和virtual table pointers通常被分别地称为vtbl和vptr。一个vtbl通常是一个函数指针数组。(一些编译器

2006-10-24 21:22:00 685

原创 编程交流与学习--More Effective C++的学习-Item M22:考虑用运算符的赋值形式(op=)取代其单独形式(op)

就C++来说,operator+、operator=和operator+=之间没有任何关系,因此如果你想让这三个operator同时存在并具有你所期望的关系,就必须自己实现它们。同理,operator -, *, /, 等等也一样。templateconst T operator+(const T& lhs, const T& rhs){ return T(lhs) += rhs; }

2006-10-22 21:41:00 653

原创 编程交流与学习--More Effective C++的学习-Item M21:通过重载避免隐式类型转换

class UPInt {                                 // unlimited precisionpublic:                                       // integers 类  UPInt();  UPInt(int value);  ... }; upi3 = upi1 + 10; upi

2006-10-22 20:53:00 671

原创 编程交流与学习--More Effective C++的学习-Item M20:协助完成返回值优化

// 一种高效和正确的方法,用来实现返回对象的函数const Rational operator*(const Rational& lhs,                         const Rational& rhs){  return Rational(lhs.numerator() * rhs.numerator(),                  lhs.

2006-10-22 20:46:00 856

原创 编程交流与学习--More Effective C++的学习-Item M19:理解临时对象的来源

当程序员之间进行交谈时,他们经常把仅仅需要一小段时间的变量称为临时变量。不过就C++而言,一个函数的局部对象不是临时变量。    在C++中真正的临时对象是看不见的,它们不出现在你的源代码中。建立一个没有命名的非堆(non-heap)对象会产生临时对象。这种未命名的对象通常在两种条件下产生:为了使函数成功调用而进行隐式类型转换和函数返回对象时。理解如何和为什么建立这些临时对象是很重要的,因为构造和

2006-10-22 20:37:00 642

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除