C#高级编程9 内存管理和指针 后台内存管理 1) 值数据类型 在处理器的虚拟内存中有一个区域,称为栈,栈存储变量的浅副本数据,通过进入变量的作用域划分区域,通过离开变量的作用域释放. 栈的指针指向栈保留的内存块的末尾,栈是向下填充的,比如说内存是4g,,那么就从4g开始直至占用0g,每一个区域的划分都由下一个空闲存储单元. 2) 引用数据类型 变量的生存期是互相嵌套的,一般情况下变量的生存期在一个方法中定义会在一个方法外结束,不过有时候需要在方法外数据仍是可用的,这时候需要用到引用类型. 引用…
(一)后台内存管理 1.值数据类型 Windows使用一个虚拟寻址系统,该系统把程序可用的内存地址映射到硬件内存中的实际地址,该任务由Windows在后台管理(32位每个进程可使用4GB虚拟内存,64位更多,这个内存包括可执行代码和加载的DLL,以及程序运行时使用的变量内容). 在处理器的虚拟内存中,有一个区域称为栈.栈存储不是对象成员的值数据类型. 释放变量时,其顺序总是与它们分配内存的顺序相反,这就是栈的工作方式. 程序第一次运行时,栈指针指向为栈保留的内存块末尾.栈实际上是向下填充的,即从…
本文转载自Netprawn,原文英文版地址 尽管在.net framework中我们不太需要关注内存管理和垃圾回收这方面的问题,但是出于提高我们应用程序性能的目的,在我们的脑子里还是需要有这方面的意识.明白内存管理的基本行为将有助于我们解释我们程序中变量是如何操作的.在本文中我将讨论栈和堆的一些基本知识,变量的类型和某些变量的工作原理.当你在执行程序的时候内存中有两个地方用于存储程序变量.如果你还不知道,那么就来看看堆和栈的概念.堆和栈都是用于帮助我们程序运行的,包含某些特殊信息的操作系统内存模…
读<C#高级编程>第1章 .Net机构体系笔记 网红的话:爸爸说我将来会是一个牛逼的程序员,因为我有一个梦,虽然脑壳笨但是做事情很能坚持. 本章主要是了解.Net的结构,都是一些概念,并没有可操作的代码.但是这些概念有联系,但深刻理解必须要有全局思维和实践基础. 目录: C#与.Net的关系 公共语言运行库(CLR) 中间语言 程序集 .NET Framework类 名称空间(命名空间):避免类名冲突的一种方式. 用C#创建.Net应用程序(介绍一堆产品概念) C#在.Net企业体系结构中的重…
C#高级编程9 第17章 使用VS2013 编辑定位到 如果默认勾选了这项,请去掉勾选,因为勾选之后解决方案的目录会根据当前文件选中. 可以设置项目并行生成数 版本控制软件设置 所有文本编辑器行号显示 启用编辑继续 收集调试信息,将影响性能 Code Compare这是扩展与更新里面的插件,安装之后才会显示,用来比较代码是否相同 nuget包源配置,提供了nuget更新的数据源 目标框架的设置影响到项目基础框架的引用,不同目标框架的项目之间不能互相引用. 不安全代码和警告等级可能会影响生成 特定…
C#高级编程9 第18章 部署 使用 XCopy 进行部署 本主题演示如何通过将应用程序文件从一台计算机复制到另一台计算机来部署应用程序. 1.将项目中生成的程序集复制到目标计算机,生成的程序集位于项目中的bin\debug目录下 2.在开发计算机上找到vcredist_x86.exe复制到目标计算机 3.在目标计算机运行vcredist_x86.exe,安装所需C++运行库 4.应用程序运行 使用ClickOne进行部署 百度经验使用ClickOne发布Windows应用程序 工具/原料  …
C#高级编程9 第16章 错误和异常 了解这章可以学会如何处理系统异常以及错误信息. System.Exception类是.NET运行库抛出的异常,可以继承它定义自己的异常类. try块代码包含的代码是可能发生异常的代码catch块代码包含发生异常之后处理错误情况finally块代码用于清理资源以及无论是否出现异常都需要处理的功能代码 对于系统异常和自定义异常都来自Exception类,可以定义多个catch块,处理不同异常的错误. System.Exception类的Data属性可以提供异常的…
[翻译]<深入解析windows操作系统第6版下册>第10章:内存管理(第一部分) [翻译]<深入解析windows操作系统第6版下册>第10章:内存管理(第二部分) [翻译]<深入解析windows操作系统第6版下册>第10章:内存管理(第三部分) . . .…
目录 Object-C 基础教程第九章,内存管理 前言: 对象生命周期 引用计数 RetainCount1项目例子 对象所有权 访问方法中的保留和释放 自动释放 所有对象放入池中 自动释放池的销毁时间 自动释放池的工作流程 Cocoa的内存管理规则 临时对象 拥有对象 垃圾回收 自动引用计数 iOS无法使用垃圾回收机制 ARC介绍 ARC条件 弱引用(Weak).强引用 拥有者权限 异常 与异常有关的关键字 捕捉不同类型的异常 抛出异常 异常也需要内存管理 异常和自动释放池 小结 Pwn菜鸡学习…
变量的初始化和作用域 C#的预定义数据类型 流控制 枚举 名称空间 预处理命令 C#编程的推荐规则和约定 变量的初始化和作用域 初始化 C#有两个方法可以一确保变量在使用前进行了初始化: 变量是字段,如果没有显式初始化,创建这些变量时,其默认值为0. 方法的局部变量必须在代码中显式初始化,之后才能在语句中使用,如果在初始化之前使用了他的值,报错. 作用域 如果局部变量作用域冲突,报CS0136错. 字段与局部变量冲突,隐藏掉字段,访问被隐藏的实例字段用this关键字,静态字段使用object.f…
Github https://github.com/gongluck/Windows-Core-Program.git //第14章 探索虚拟内存.cpp: 定义应用程序的入口点. // #include "stdafx.h" #include "第14章 探索虚拟内存.h" int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lp…
Github https://github.com/gongluck/Windows-Core-Program.git //第13章 内存体系结构.cpp: 定义应用程序的入口点. // #include "stdafx.h" #include "第13章 内存体系结构.h" int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lp…
1.1 C#与.NET的关系 C#不能孤立地使用,必须与.NET Framework一起使用一起考虑. (1)C#的体系结构和方法论反映了.NET基础方法论. (2)多数情况下,C#的特定语言功能取决于.NET的功能,或依赖于.NET基类. .NET支持的一些特性,C#并不支持.C#语言支持的另一些特性,.NET却不支持. 1.2 公共语言运行库(CLR) 1.2.1 平台无关性 .NET Framework 的核心是其运行库环境,称为公共语言运行库(CLR)或.NET运行库. 通常将CLR控制…
2015/12/10补充: 当我们需要给一个数组返回所赋的值的时候,我们需要传入指针的指针.当我们只需要一个值的时候,传入指针即可,或者引用也可以. 结构大致如下: char* p = (char*)malloc(sizeof(char)*num); while() { func(char** p); } free(p); void func(char**p) { char buffer[num] = {0}; for(int i = 0; i < num; ++i) (*p)[i] = buf…
本章目标:     了解虚拟地址和物理地址的关系:     掌握如何通过设置MMU来控制虚拟地址到物理地址的转化:     了解MMU的内存访问权限机制:     了解TLB.Cache.Write buffer的原理,使用时的注意事项:     通过实例深刻掌握上述要点: 7.1 内存管理单元MMU介绍 7.1.1 S3C2410/S3C2440 MMU特性 内存管理单元(Memory Management Unit),简称MMU,它负责虚拟地址到物理 地址的映射,并提供硬件机制的内存访问权限…
7.1 内存管理单元MMU介绍 7.1.1 S3C2410/S3C2440 MMU特性 负责虚拟地址到物理地址的映射,并提供硬件机制的内存访问权限检查 特性: 与ARM V4兼容的映射长度.域.访问权限检查机制 4种映射长度:段(1MB).大页(64kb).小页(4kb).极小页(1kb) 对每段都可以设置访问权限 大页.小页的每个子页(被映射页的1/4)都可以单独设置访问权限 硬件实现的16个域 指令TLB(含64个条目).数据TLB(含64个条目) 硬件访问页表(地址映射.权限检查由硬件自动…
内存管理: 确保在须要的时候分配内存,在程序运行结束时释放占用的内存 假设仅仅分配内存而不释放内存,则会发生内存泄漏(leak memory),程序的内存占用量不断添加.终于会被耗尽并导致程序崩溃. 不要使用不论什么刚释放的内存,否则可能误用陈旧的数据.假设内存已经载入了其它数据,将会破坏这些新数据. 9.1 对象生命周期 对象的生命周期: 诞生:通过alloc或new方法实现 生存:接受消息并运行操作 交友:通过复合以及向方法传递函数 死去:被释放掉 9.11 引用计数 关于引用计数的操作:…
Chapter 5 Memory Management 内存管理 The 80386 transforms logical addresses (i.e., addresses as viewed by programmers) into physical address (i.e., actual addresses in physical memory) in two steps: 80386通过两步将一个逻辑地址(程序所引用的地址)转移为物理地址(实际的物理内存地址). Segment t…
前面分析了memblock算法.内核页表的建立.内存管理框架的构建,这些都是x86处理的setup_arch()函数里面初始化的,因地制宜,具有明显处理器的特征.而start_kernel()接下来的初始化则是linux通用的内存管理算法框架了. build_all_zonelists()用来初始化内存分配器使用的存储节点中的管理区链表,是为内存管理算法(伙伴管理算法)做准备工作的.具体实现: [file:/mm/page_alloc.c] /* * Called with zonelists_…
以下内容转载自安富莱电子: http://forum.armfly.com/forum.php 内存管理介绍在 ANSI C 中,可以用 malloc()和 free()2 个函数动态的分配内存和释放内存,但是,在嵌入式实时操作系统中,调用 malloc()和 free()却是危险的,因为多次调用这两个函数会把原来很大的一块连续内场区域逐渐地分割成许多非常小而且彼此又不相邻的内存块,也就是内存碎片.由于这些内存碎片的大量存在,使得程序到后来连一段非常小的连续内存也分配不到.另外,由于内存管理算法…
前面已经分析了linux内存管理算法(伙伴管理算法)的准备工作. 具体的算法初始化则回到start_kernel()函数接着往下走,下一个函数是mm_init(): [file:/init/main.c] /* * Set up kernel memory allocators */ static void __init mm_init(void) { /* * page_cgroup requires contiguous pages, * bigger than MAX_ORDER unle…
前面已经分析了内存管理框架的构建实现过程,有部分内容未完全呈现出来,这里主要做个补充. 如下图,这是前面已经看到过的linux物理内存管理框架的层次关系. 现着重分析一下各个管理结构体的成员功能作用. [file:/include/linux/mmzone.h] typedef struct pglist_data { struct zone node_zones[MAX_NR_ZONES]; struct zonelist node_zonelists[MAX_ZONELISTS]; int…
前面构建内存管理框架,已经将内存管理node节点设置完毕,接下来将是管理区和页面管理的构建.此处代码实现主要在于setup_arch()下的一处钩子:x86_init.paging.pagetable_init().据前面分析可知x86_init结构体内该钩子实际上挂接的是native_pagetable_init()函数. native_pagetable_init(): [file:/arch/x86/mm/init_32.c] void __init native_pagetable_in…
memory:表示可用可分配的内存: 结束完memblock算法初始化前的准备工作,回到memblock算法初始化及其算法实现上面.memblock是一个很简单的算法. memblock算法的实现是,它将所有状态都保存在一个全局变量__initdata_memblock中,算法的初始化以及内存的申请释放都是在将内存块的状态做变更.那么从数据结构入手, __initdata_memblock是一个memblock结构体.其结构体定义: [file:/include/linux/memblock.h…
memblock算法是linux内核初始化阶段的一个内存分配器(它取代了原来的bootmem算法),实现较为简单.负责page allocator初始化之前的内存管理和分配请求. 分析memblock算法,可以从几点入手: memblock算法初始化: memblock算法管理内存的申请和释放: memblock算法前的准备: 前面已经分析了linux系统在初始化的过程中,使用int 15中断探知了机器的内存分布图(e820图),其数据是存储在boot_params.e820_map里面,这里面…
本章要点 运行库在栈和堆上分配空间 垃圾回收 使用析构函数 和 SYstem.IDisposable 接口来释放非托管的资源 C#中使用指针的语法 使用指针实现基于栈的高性能数组 值类型数据 程序第一次开始运行时,栈指针指向为栈保留的内存块末尾.栈实际是从高内存地址向低内存地址填充的,向下填充.当数据入栈后,栈指针就会随之调整,以始终指向下一个空间存储单元. 引用数据类型 虽然栈有非常高的性能,但它没有灵活到可以用于所有的变量(引用类型).引用类型,用 new 运算符请求分配存储空间,存放托管堆…
1.fgets()函数 该函数是一个文件操作相关的函数 暂时使用这个函数可以从键盘上接收一个字符串,保存到数组中 char str[50]; 1)scanf("%s",str);//缺点:不能接收空格,也是不安全的 2)gets(str);//优点:可以接收空格 //缺点:会有一个警告,不安全的,比如数组的长度是50,我们输入的字符大于等于50的时候,会把50个字符全部放到数组中 //没有空间存放字符串结束符 3)fgets是一个安全的字符串接收函数,比如数组的长度是50,我们输入的字…
(一)程序集的含义 程序集是.NET用于部署和配置单元的术语. .NET应用程序包含一个或多个程序集.通常扩展名是EXE或DLL的.NET可执行程序称为程序集. 程序集是自我描述的安装单元,由一个或多个文件组成.程序集可以是私有或共享的. 1.程序集的功能 程序集是自描述的. 版本的相互依赖在程序集的清单中进行了记录. 程序集可以并行加载. 应用程序使用应用程序域来确保其独立性. 安装非常简单. 2.程序集的结构 程序集由描述它的程序集元数据.描述导出类型和方法的类型元数据.MSIL代码和资源组…
# -*- coding: utf-8 -*-# python:2.x__author__ = 'Administrator'#由于5,6,7,8,9,10,11主要是在包,测试之类的学习所以这边就不学习 #优化:通用原则和剖析技术print(u'过早进行优化是编程中万恶之源-------Donald Knuth') #1:优先三原则"""无论结果如何,优化是需要代价的,当代码能够正常工作时,不用会理会它(有时)可能比不惜一切代价尝试让它运行得更快要好一些当优化代码,需要3条…
7.2 main函数 1.C程序总是从main函数开始执行的,原型:int main(int argc,char *argv[]);argc是命令行参数的个数argc是指向参数的各个指针所构成的数组2.内核执行C程序时,在调用main前先调用一个特殊的启动例程.可执行程序文件将此启动例程作为程序的起始地址.启动例程从内核取得命令行参数和环境变量值,然后为按照上述方式调用main函数做好安排.(这是由连接编辑器设置的,而连接编辑器则由C编译器调用)启动例程有点像这样子:exit(main(argc…