• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 基于C++内存分配、函数调用与返回值的深入分析

基于C++内存分配、函数调用与返回值的深入分析

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c#调用c++ dll,c调用c++,c#调用c++dll实例,c++函数调用,c++调用dll等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
在谈述函数调用和返回值问题之前,先来看看C++中内存分配的问题。
C++编译器将计算机内存分为代码区和数据区,很显然,代码区就是存放程序代码,而数据区则是存放程序编译和执行过程出现的变量和常量。数据区又分为静态数据区、动态数据区,动态数据区包括堆区和栈区。
以下是各个区的作用:
(1)代码区:存放程序代码;
(2)数据区
a.静态数据区: 在编译器进行编译的时候就为该变量分配的内存,存放在这个区的数据在程序全部执行结束后系统自动释放,生命周期贯穿于整个程序执行过程。
b.动态数据区:包括堆区和栈区
堆区:这部分存储空间完全由程序员自己负责管理,它的分配和释放都由程序员自己负责。这个区是唯一一个可以由程序员自己决定变量生存期的区间。可以用malloc,new申请对内存,并通过free和delete释放空间。如果程序员自己在堆区申请了空间,又忘记将这片内存释放掉,就会造成内存泄露的问题,导致后面一直无法访问这片存储区域。
栈区:存放函数的形式参数和局部变量,由编译器分配和自动释放,函数执行完后,局部变量和形参占用的空间会自动被释放。效率比较高,但是分配的容量很有限。
注意:
1)全局变量以及静态变量存放在静态数据区;
2)注意常量的存放区域,通常情况下,常量存放在程序区(程序区是只读的,因此任何修改常量的行为都是非法的),而不是数据区。有的系统,也将部分常量分配到静态数据区,比如字符串常量(有的系统也将其分配在程序区)。但是要记住一点,常量所在的内存空间都是受系统保护的,不能修改。对常量空间的修改将造成访问内存出错,一般系统都会提示。常量的生命周期一直到程序执行结束为止。
在弄懂内存分配的问题过后,来看看函数调用的过程:
执行某个函数时,如果有参数,则在栈上为形式参数分配空间(如果是引用类型的参数则类外),继续进入到函数体内部,如果遇到变量,则按情况为变量在不同的存储区域分配空间(如果是static类型的变量,则是在进行编译的过程中已经就分配了空间),函数内的语句执行完后,如果函数没有返回值,则直接返回调用该函数的地方(即执行远点),如果存在返回值,则先将返回值进行拷贝传回,再返回执行远点,函数全部执行完毕后,进行退栈操作,将刚才函数内部在栈上申请的内存空间释放掉。
下面通过几个例子来谈谈内存分配和函数返回值的问题:
内存分配的问题:
  &nb
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#如何调用原生C++ COM对象详解
  • C++与C#互调dll的实现步骤
  • C++实现调用系统时间简单示例
  • C++调用C#的DLL实现方法
  • c++获取进程信息列表和进程所调用的dll列表
  • 浅析C#与C++相关概念的比较
  • 基于C++内存分配、函数调用与返回值的深入分析

相关文章

  • 2017-05-28利用C语言实践OOP,以及new,delete的深入分析
  • 2017-05-28在C语言中转换时间的基本方法介绍
  • 2017-05-28c++传递函数指针和bind的示例
  • 2017-05-28利用C语言替换文件中某一行的方法
  • 2017-05-28C语言入门之指针用法教程
  • 2017-05-28C语言 字符串首字母转换成大写简单实例
  • 2017-05-28C++动态数组类的封装实例
  • 2017-05-28C语言运算符的优先级和结合性实例详解
  • 2017-05-28c++ builder TreeView控件节点遍历代码
  • 2017-05-28解析在WTL下使用双缓冲的实现方法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 浅析C/C++中的可变参数与默认参数
    • C++求逆序对的方法
    • c实现linux下的数据库备份
    • Linux下C语言实现C/S模式编程
    • 素数筛选法
    • 全面解析设计模式中的建造者模式及相关C++实现
    • C++虚析构函数的使用分析
    • 深入理解C++的动态绑定与静态绑定的应用详解
    • 使用C语言来解决循环队列问题的方法
    • 使用C语言解决字符串匹配问题的方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有