科研和工程中的C++编程1_概述.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
科研和工程中的C++编程 概述 课程任务 掌握编程目的和意义 了解代码编写和优化的技巧 掌握科研工程的问题建模方法和步骤 掌握面向空间的设计方法 掌握面向时间的设计方法 实践各种设计方法 编程目的和意义 目的: 用计算机程序完成科研和工程中的实际问题。 意义: 和计算机对话,以看到需要的计算结果。 主要平台: 通用编程:windows Linux UNIX各版本 macOS 其他:各种嵌入式操作系统 代码的主要目标形式 桌面程序(科研和工程问题解决的主要方式) 代码的主要目标形式 脚本程序 以一个特定的桌面程序为宿主平台,一般解释执行,主要有: (1)web应用程序(服务器端脚本,客户端在浏览器中运行的各种脚本程序) (2)办公软件(word, excel之VBA,SQLServer中存储过程等) (3)科学计算程序(matlab, mathematic, mathCAD, AutoCAD, 3DMax, Photoshop等) (4)游戏动画(3D游戏引擎下的如lua等脚本) 代码的主要目标形式 程序代码最终生成模块(Module),在C#中称为装配件(Assembly) 进程(Process)是操作系统多任务并发执行的一个基本单位,在进程下还可以创建线程(Thread),作为多任务并发执行的补充。Windows以线程为基本调度单位,Linux以进程为基本调度单位。 操作系统创建一个进程时,会装入所需模块,并执行其中的代码。 后续课程《操作系统》会详述。 代码的主要目标形式 进程中模块的分类 代码的主要目标形式 进程拥有自己的独立编址的内存空间(称为虚拟内存空间),在32位操作系统下最大达4G,在64位操作系统下更大。进程的虚拟内存空间按多个固定大小的内存页面来组织,分为可交换页和非可交换页两种,模块的代码和数据就是映射到这些页面上,由操作系统根据需要调入物理内存来执行。操作系统直接把进程空间的高地址部分映射到已经装载了驱动模块的那些系统的内存页面上。 代码的主要目标形式 操作系统根据用户的要求为一个可执行模块创建一个进程,同时根据可执行模块文件内的信息装载它所依赖的动态模块(同样动态模块要是依赖其它动态模块就递归地依次装入)。当然也可以在程序内用API函数动态地装载模块。动态模块内的函数地址被重新定位,使得其他各种类型的模块能调用它们。具体动态链接的过程可看参考书《Linker and loader》。 代码的主要目标形式 模块的组成 (1)机器代码 (2)已初始化全局数据(如全局变量) (3)未初始化全局数据(如方法/函数内的静态局部变量) (4)资源(windows下DLL内,可看作特殊全局数据) (5)模块信息(各种信息及导入/导出函数表) 代码的主要目标形式 一个进程内含有一个可执行模块(指含主入口的exe模块,也会有其他exe模块被动态装载,此时都算作动态模块)和多个动态模块(不讨论驱动模块)。 动态链接库可以做到机器代码在不同的进程间共享,而全局性数据则为每个进程复制一份独立的拷贝 (有特殊设置可以让全局性数据在不同的进程间共享,但一般不这样作,而用共享内存方法来取代),所以动态库是二进制级别的代码复用方法。 C++程序(类、函数等)则是源代码级别的代码复用方法。显然源代码若修改了整个软件要重新编译*。 代码的主要目标形式 操作系统如果装载了一个可执行模块的多个实例,即多个进程都装载了同一个exe模块和其依赖的动态模块,那么该可执行模块的机器代码页同样可以被多个进程共享,全局性数据自然是每个进程有一份自己的拷贝。 编写大型工程/算法软件需要进行模块的分划和设计。 编写代码的一个考虑 全局变量、类的静态成员变量、方法/函数内的静态局部变量(线程局部存储变量除外)都会在模块内有自己唯一的一个地址。如果源代码有这样的变量,并在生成exe模块或者多个dll模块时被使用,那么进程内将有多份这样的全局性变量。 如果算法设计中需要的一个全局性的变量是相对进程来说是唯一的,就不能把含有该全局性的变量的代码做成源代码级别的共享的库,而是做在一个单独的动态链接库内,再通过一系列函数来操作该变量。 编写代码的一个考虑 由于一个进程可以创建多个线程,而这些线程是可以并行访问同一进程空间内的数据的,因此要注意对可能被多个线程访问和修改的数据进行同步保护。 前述的全局性的变量要特别注意进行多线程保护,特别是方法/函数内的静态局部变量,它是在第一次被调用时初始化的,如果有多个线程同时调用该方法/函数而不注意保护,可能造成该静态局部变量被多次初始化。(该方法/函数是不可重入的) 编写代码的一个考虑 CRT库中隐含有全局变量。采用动态链接没有问题,但采用静态链接将使每个模块都有一份这样的全局变量。如new,malloc等动态内存平分配函数会使

文档评论(0)

didala + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档