c内存模型,aspnet怎么学

1 , aspnet怎么学如果你已经有较多的面向对象开发经验,跳过以下这两步:第一步 掌握一门.NET面向对象语言,C#或VB.NET 。我强烈反对在没系统学过一门面向对象语言的前提下去学ASP.NET 。ASP.NET是一个全面向对象的技术 , 不懂面向对象,那绝对学不下去!第二步 对.NET Framework类库有一定的了解可以通过开发Windows Form应用程序来学习.NET Framework 。ASP.NET是建构在.NET Framework之上的技术,你对.NET Framework了解得越深,学习ASP.NET就越快 。举个例子:下面简单列出几个对掌握ASP.NET非常重要的概念:对象的内存模型,委托,事件,多线程,程序集和应用程序域,安全模型.NET Framework当然还有许多其它的东西 , 但不理解与把握清楚上述这些东西,是很难真正把握ASP.NET的 。出于急迫的心情与现实的考虑,不少人没有扎实的面向对象基础就想直接学习ASP.NET , 其结果只能是欲速则不达 。在具备了面向对象基础之后 , 以下是具体的学习ASP.NET技术步骤 。第一步:学习HTML与CSS这并不需要去学一大堆的诸如Dreamweaver,Firework之类的各种网页设计工具,关键是理解HTML网页嵌套的block结构与CSS的 box模型 。许多ASP.NET控件最后都必须转化为HTML 。而且,div+CSS是当前主流的网页布局模型 。学习这部分时,关键在于理解概念,而不需要将精力花在美化页面的许多技巧上,那是网站美工的工作,不是程序员的工作 。第二步:学习JavaScript 。JavaScript不是Java , 它主要运行于浏览器端 。可以完成许多工作,功能也很强大:比如它将客户端网页中的HTML元素看成一棵树,可以编写代码访问并修改树节点 , 动态生成新的HTML代码,从而达到动态修改网页显示特性的目的 。JavaScript在目前的网站开发中用得很多 , 非常重要 。另外 , 它也是目前非常流行的AJAX技术的基础 。第三步:学习计算机网络原理找一本大学<计算机网络>教材,重点看看它的有关互联网的部分 , 了解一些域名解析和HTTP协议等知识 。这是进行互联网开发的理论基础 。第四步:学习ASP.NET表示层技术,会设计Web页面需要结合先前打好的面向对象技术的基础,至少掌握以下内容:(1)各种Web控件的使用方法,(2)理解信息在网页中的传送方式,比如Cookie,ViewState,Session等的使用 。(3)ASP.NET应用程序与网页的生命周期,以及相关对象(比如httpcontext,response,request)的用途 。(4)ASP.NET实现事件驱动的内幕(5)自定义用户控件再次强调一下,没有面向对象基础,很难掌握上述技术,就只能被这些东东牵着鼻子走了,会很被动 。第五步 掌握数据库技术具体地说,要学习以下内容:(1)学会使用SQL Server 2005:不要求精通它的各种工具与管理配置技术,但至少知道如何连接,如何建表,如何创建存储过程(2)学习ADO.NET,掌握使用代码人工访问数据库(别用VS2005的向导)的方法(3)学习数据绑定控件的使用第六步 理解多层架构这时,先前在对象学习阶段涉及到的程序集与应用程序域等就派上用场了,现在 , 网站架构大多采用多层架构:表示层、业务逻辑层、数据存取层以及数据库本身 。可以先上网找一此多层架构的资料看,再找一个现成的比较复杂的开源ASP.NET项目分析一下其架构就差不多了 。基本上都是一个套路,到处应用 。有的朋友问:学习架构是不是必须学习设计模式 。我的看法是:不必!当然,你如果学习过设计模式,那当然更好 。但在实际开发中,如果只想着机械地套用某种模式 , 反而起不到好的结果 。我的观点:在学习设计模式时要多思多悟,其思想就会渐渐地融入你的大脑,在真实的设计实践中,忘掉所有的写在书上的模式,一切从实际出发 , 相信你的直觉 , 只要达到设计要求的方案就是可行的方案,事实上 , 你这样做了之后,回过头来再看 , 会发现你的设计往往暗合设计模式的理论 。第七步 学习XML与Web Service先了解XML的基础知识,找本讲XML的书看一下就差不多了,然后 , 再学习Web Service 。Web Service其实可类比为远程方法调用(以XML格式表达的调用信息) 。学 到了这里 , 如果你还有兴趣,不妨再去看看SOA,不过SOA的资料都是理论与概念,看起来比较郁闷,而且离实际开发可能比较远 。所以,这是可选项 。
2 , c 为什么hashmap占用内存多c++ 中hashmap占用内存多的原因是基础类型太少,对象用的太多导致的 。解决方法:1、导入stl中的hash_map类库#include <hash_map>using namespace std;using namespace stdext;2、hash_map是一个聚合类它继承自_Hash类,包括一个vector,一个list和一个pair , 其中vector用于保存桶,list用于进行冲突处理 , pair用于保存key->value结构,简要地伪码如下: class hash_map<class _Tkey, class _Tval>private:typedef pair<_Tkey, _Tval> hash_pair;typedef list<hash_pair>hash_list;typedef vector<hash_list>hash_table;};3、用法举例:hash_map<int, int> IntHash;IntHash[1] = 123;IntHash[2] = 456;int val = IntHash[1];int val = IntHash[2];当然,这只是一个简单模型,C++标准库的泛型模版一向以嵌套复杂而闻名,初学时看类库,无疑天书啊 。微软的hash_map类还聚合了hash_compare仿函数类,hash_compare类里又聚合了less仿函数类,乱七八糟的 。get方法是弱一致的,是什么含义?可能你期望往ConcurrentHashMap底层数据结构中加入一个元素后,立马能对get可见,但ConcurrentHashMap并不能如你所愿 。换句话说,put操作将一个元素加入到底层数据结构后,get可能在某段时间内还看不到这个元素,若不考虑内存模型,单从代码逻辑上来看,却是应该可以看得到的 。用hashmap>作为数据结构,然后,添加删除什么的就在hashmap里面的hashset加一个A比如说当然,这只是一个简单模型,C++标准库的泛型模版一向以嵌套复杂而闻名,初学时看类库,无疑天书啊 。微软的hash_map类还聚合了hash_compare仿函数类,hash_compare类里又聚合了less仿函数类,乱七八糟的 。下面说说使用方法:一、简单变量作为索引:整形、实性、指针型其实指针型也就是整形,算法一样 。但是hash_map会对char*, const char*, wchar_t*, const wchar_t*做特殊处理 。这种情况最简单,下面代码是整形示例:[cpp] view plaincopyhash_map<int, int> IntHash;IntHash[1] = 123;IntHash[2] = 456;int val = IntHash[1];int val = IntHash[2];实型和指针型用法和整形一样,原理如下:1、使用简单类型作索引声明hash_map的时候,不需要声明模版的后两个参数(最后一个参数指名hash_map节点的存储方式,默认为pair,我觉得这就挺好 , 没必要修改),使用默认值就好 。2、对于除过字符串的其它简单类型,hash_map使用模版函数 size_t hash_value(const _Kty& _Keyval) 计算hash值,计算方法是经典的掩码异或法,自动溢出得到索引hash值 。微软的工程师也许开了一个玩笑,这个掩码被定义为0xdeadbeef(死牛肉 , 抑或是某个程序员的外号) 。3、对于字符串指针作索引的时候,使用定类型函数inline size_t hash_value(const char *_Str)或inline size_t hash_value(const wchar_t *_Str)计算hash值 , 计算方法是取出每一个字符求和,自动溢出得到hash值 。对于字符串型的hash索引,要注意需要自定义less仿函数 。因为我们有理由认为,人们使用hash表进行快速查找的预期成本要比在hash表中插入的预期成本低得多,所以插入可以比查找昂贵些;基于这个假设,hash_map在有冲突时 , 插入链表是进行排序插入的,这样在进行查询冲突解决的时候就能够更快捷的找到需要的索引 。但是,基于泛型编程的原则,hash_map也有理由认为每一种类型都支持使用"<"来判别两个类型值的大小,这种设计恰好让字符串类型无所适从,众所周知,两个字符串指针的大小并不代表字符串值的大小附上出处链接:http://blog.csdn.net/srzhz/article/details/7881946/
3,C语言中有哪些存储类型c语言中的存储类型有auto, extern, register, static 这四种,存储类型说明了该变量要在进程的哪一个段中分配内存空间,可以为变量分配内存存储空间的有数据区、BBS区、栈区、堆区 。1. auto存储类型auto只能用来标识局部变量的存储类型,对于局部变量,auto是默认的存储类型 , 不需要显示的指定 。因此,auto标识的变量存储在栈区中 。2. extern存储类型extern用来声明在当前文件中引用在当前项目中的其它文件中定义的全局变量 。如果全局变量未被初始化,那么将被存在BBS区中,且在编译时,自动将其值赋值为0,如果已经被初始化,那么就被存在数据区中 。全局变量,不管是否被初始化,其生命周期都是整个程序运行过程中,为了节省内存空间,在当前文件中使用extern来声明其它文件中定义的全局变量时,就不会再为其分配内存空间 。3. register存储类型声明为register的变量在由内存调入到CPU寄存器后,则常驻在CPU的寄存器中 , 因此访问register变量将在很大程度上提高效率,因为省去了变量由内存调入到寄存器过程中的好几个指令周期 。4. static存储类型被声明为静态类型的变量,无论是全局的还是局部的,都存储在数据区中,其生命周期为整个程序 , 如果是静态局部变量 , 其作用域为一对{}内,如果是静态全局变量 , 其作用域为当前文件 。静态变量如果没有被初始化,则自动初始化为0 。静态变量只能够初始化一次 。自动,静态,外部,寄存在函数体内声明的变量在默认情况下都是auto存储类型在代码块之间传递信息的一种方法就是使用外部变量 。当一个变量在函数的外部被声明时,安的存储空间是永久分配的,安人存储类型是extren.外部变量的声明看上去和函数或代码块内部所声明的变量一样 。外部变量对于它之后的所有函数都有效 。在代码块或函数后,外部变量仍然存在 。static的基本用途是允许一个局部变量在重新进入代码块时能够保持原来的值 。这和自动变量形成了鲜明的对比,自动变量在代码块时会被销毁 , 再次进入这个代码块时,它必须重新进行初始化 。register存储类型告诉编译器相关的变量应该改量存储在高速度的寄存器中 。使用register存储类型的目的一般是为了提高执行速度 , 但是,register声明只是向编译器所提出的“建议” , 并非强制要求在c语言中,具体的存储类别有自动(auto)、寄存器(register)、静态(static)及外部(extern)四种 。静态存储类别与外部存储类别变量存放在静态存储区,自动存储类别变量存放在动态存储区,寄存器存储类别直接送寄存器 。简介 C语言是Combined Language(组合语言)的中英混合简称 。1. C是中级语言 。它把高级语言的基本结构和语句与低级语言的实用性结合起来 。C 语言可以像汇编语言一样对位、字节和地址进行操作, 而这三者是计算机最基本的工作单元 。2.C是结构式语言 。结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立 。这种结构化方式可使程序层次清晰,便于使用、维护以及调试 。C 语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向 , 从而使程序完全结构化 。3.C语言功能齐全 。具有各种各样的数据类型,并引入了指针概念,可使程序效率更高 。另外C语言也具有强大的图形功能,支持多种显示器和驱动器 。而且计算功能、逻辑判断功能也比较强大,可以实现决策目的的游戏 。4. C语言适用范围大 。适合于多种操作系统,如Windows、DOS、UNIX等等;也适用于多种机型 。C语言对编写需要硬件进行操作的场合,明显优于其它解释型高级语言,有一些大型应用软件也是用C语言编写的 。C语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件 , 三维,二维图形和动画 。它是数值计算的高级语言 。5.C语言文件由数据序列组成,可以构成二进制文件或文本文件 常用的C语言IDE(集成开发环境)有Microsoft Visual C++,Dev-C++,Code::Blocks,Borland C++,Watcom C++ ,Borland C++ Builder,GNU DJGPP C++,Lccwin32 C Compiler 3.1,High C,Turbo C,C-Free,win-tc 等等…… 对于一个初学者,Microsoft Visual C++是一个比较好的软件 。界面友好 , 功能强大 , 调试也很方便 。(1)顺序结构 顺序结构的程序设计是最简单的,只要按照解决问题的顺序写出相应的语句就行,它的执行顺序是自上而下,依次执行 。例如:a = 3,b = 5,现交换a , b的值,这个问题就好像交换两个杯子水,这当然要用到第三个杯子 , 假如第三个杯子是c,那么正确的程序为:c = a; a = b; b = c; 执行结果是a = 5,b = c = 3如果改变其顺序,写成:a = b; c = a; b =c; 则执行结果就变成a = b = c = 5,不能达到预期的目的 , 初学者最容易犯这种错误 。顺序结构可以独立使用构成一个简单的完整程序,常见的输入、计算,输出三步曲的程序就是顺序结构,例如计算圆的面积,其程序的语句顺序就是输入圆的半径r , 计算s = 3.14159*r*r,输出圆的面积s 。不过大多数情况下顺序结构都是作为程序的一部分,与其它结构一起构成一个复杂的程序,例如分支结构中的复合语句、循环结构中的循环体等 。(2) 分支结构 顺序结构的程序虽然能解决计算、输出等问题,但不能做判断再选择 。对于要先做判断再选择的问题就要使用分支结构 。分支结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序 。分支结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的分支语句 。分支结构适合于带有逻辑或关系比较等条件判断的计算 , 设计这类程序时往往都要先绘制其程序流程图,然后根据程序流程写出源程序,这样做把程序设计分析与语言分开,使得问题简单化,易于理解 。程序流程图是根据解题分析所绘制的程序执行流程图 。学习分支结构不要被分支嵌套所迷惑,只要正确绘制出流程图 , 弄清各分支所要执行的功能,嵌套结构也就不难了 。嵌套只不过是分支中又包括分支语句而已,不是新知识,只要对双分支的理解清楚,分支嵌套是不难的 。下面我介绍几种基本的分支结构 。①if(条件) {分支体} 这种分支结构中的分支体可以是一条语句,此时“{}”可以省略,也可以是多条语句即复合语句 。它有两条分支路径可?。?一是当条件为真 , 执行分支体,否则跳过分支体,这时分支体就不会执行 。如:要计算x的绝对值,根据绝对值定义,我们知道,当x>=0时,其绝对值不变,而x<0时其绝对值是为x的反号,因此程序段为:if(x<0)x=-x; ②if(条件) {分支1} else {分支2} 这是典型的分支结构 , 如果条件成立,执行分支1,否则执行分支2,分支1和分支2都可以是1条或若干条语句构成 。如:求ax^2+bx+c=0的根 分析:因为当b^2-4ac>=0时,方程有两个实根,否则(b^2-4ac<0)有两个共轭复根 。其程序段如下: main() { int a,b,c,d,x,y; printf("Please put the number of a,b&c from the quadratic equation of one variable one by one\n"); scanf("%d%d%d",&a,&b,&c); d=b*b-4*a*c; if(d<0) { printf("NO Root!Wrong!\n"); } else { y=-b-sqrt(d)/2*a; x=-b+sqrt(d)/2*a; printf("The 1st equation root=%d\nThe 2nd equation root=%d",y,x); } } ③IF嵌套分支语句:其语句格式为: if(条件1) {分支1} else if(条件2) {分支2} else if(条件3) {分支3} …… else if(条件n) {分支n} else {分支n+1} FOR嵌套 , 其语句格式为: for(初值A;范围A;步长A) { for(初值B;范围B;步长B) { 循环体 } } FOR嵌套例子:九九乘法表 main() { int a,b,c; for(a=1;a<=9;a++) { for(b=1;b<=a;b++) { c=b*a; printf("%dx%d=%d ",b,a,c); } printf("\n"); } } 嵌套分支语句虽可解决多个入口和出口的问题,但超过3重嵌套后,语句结构变得非常复杂,对于程序的阅读和理解都极为不便,建议嵌套在3重以内,超过3重可以用下面的语句 。④switch开关语句:该语句也是多分支选择语句,到底执行哪一块 , 取决于开关设置,也就是表达式的值与常量表达式相匹配的那一路,它不同if…else语句,它的所有分支都是并列的,程序执行时,由第一分支开始查找,如果相匹配 , 执行其后的块,接着执行第2分支,第3分支……的块,直到遇到break语句;如果不匹配,查找下一个分支是否匹配 。这个语句在应用时要特别注意开关条件的合理设置以及break语句的合理应用 。“?”语句 问号语句也是分支的一种,格式类似(a在C语言中,具体的存储类别有自动(auto)、寄存器(register)、静态(static)及外部(extern)四种 。静态存储类别与外部存储类别变量存放在静态存储区,自动存储类别变量存放在动态存储区,寄存器存储类别直接送寄存器 。turbo c2.0支持四种变量存储类型 。说明符如下:autostaticexternregister 下面分别来介绍 。一、auto auto称为自动变量 。局部变量是指在函数内部说明的变量(有时也称为自动变量) 。用关键字auto进 行说明, 当auto省略时, 所有的非全程变量都被认为是局部变量, 所以auto实际上 从来不用 。局部变量在函数调用时自动产生, 但不会自动初始化, 随函数调用的结束, 这 个变量也就自动消失了, 下次调用此函数时再自动产生, 还要再赋值, 退出时又自 动消失 。二、staticstatic称为静态变量 。根据变量的类型可以分为静态局部变量和静态全程变量 。1. 静态局部变量它与局部变量的区别在于: 在函数退出时, 这个变量始终存在, 但不能被其它 函数使用, 当再次进入该函数时, 将保存上次的结果 。其它与局部变量一样 。2. 静态全程变量turbo c2.0允许将大型程序分成若干独立模块文件分别编译, 然后将所有模块 的目标文件连接在一起, 从而提高编译速度, 同时也便于软件的管理和维护 。静态 全程变量就是指只在定义它的源文件中可见而在其它源文件中不可见的变量 。它与 全程变量的区别是: 全程变量可以再说明为外部变量(extern), 被其它源文件使用, 而静态全程变量却不能再被说明为外部的, 即只能被所在的源文件使用 。三、externextern称为外部变量 。为了使变量除了在定义它的源文件中可以使用外, 还要 被其它文件使用 。因此,必须将全程变量通知每一个程序模块文件,此时可用 extern来说明 。四、registerregister称为寄存器变量 。它只能用于整型和字符型变量 。定义符register说 明的变量被turbo c2.0存储在cpu的寄存器中,而不是象普通的变量那样存储在内 存中, 这样可以提高运算速度 。但是turbo c2.0只允许同时定义两个寄存器变量, 一旦超过两个, 编译程序会自动地将超过限制数目的寄存器变量当作非寄存器变量 来处理 。因此, 寄存器变量常用在同一变量名频繁出现的地方 。另外, 寄存器变量只适用于局部变量和函数的形式参数, 它属于auto型变量, 因此, 不能用作全程变量 。定义一个整型寄存器变量可写成:register int a;对于以上所介绍的变量类型和变量存储类型将会在以后的学习中, 通过例行程 序中的定义、使用来逐渐加深理解 。【c内存模型,aspnet怎么学】

    推荐阅读