函数调用和赋值运算

华电北风吹
天津大学认知计算与应用重点实验室
日期:2015/11/15

一、C++中内存分配
C++编译器将计算机内存分为代码区和数据区。数据区又分为静态数据区、动态数据区。动态数据区又包含堆和栈。
代码区:只读,任何修改行为非法。存放编译后的代码,包括类的成员函数等。
数据区:存放程序编译和执行过程出现的变量和常量。
静态数据区:全局变量以及静态变量存放在静态数据区。
动态数据区:包含堆和栈。
常量:通常情况下被放在代码区,有的系统将常量存放于静态数据区(字符串常量)。常量的所在的内存空间受系统保护,修改将造成内存访问出错,常量的生命周期一直到程序结束为止。
参考博客:(http://www.cnblogs.com/dolphin0520/archive/2011/04/04/2005061.html)

二、堆和栈
栈:主要存放函数的参数以及局部变量。整个程序的栈区的大小可以在编译器中由用户自行设定。
堆(heap):是为动态分配预留的内存空间。
每一个线程都有一个栈,但是每一个应用程序通常都只有一个堆(尽管为不同类型分配内存使用多个堆的情况也是有的)。
参考博客:(http://blog.jobbole.com/75321/)

三、赋值运算与临时变量
在调用函数的时候,实参和形参是通过赋值运算建立联系的。但是当实参和引用参数类型不匹配时,C++将生成临时变量。具体情况是若函数调用的参数不是左值或与相应的const引用参数的类型不匹配,则C++将创建类型正确的匿名变量,将函数调用的参数的值传递给匿名变量,并让参数引用该变量。
参考:C++ primer 第八章 8.2.3引用的属性的特别之处 P262

四、函数的调用过程
在读取函数参数的时候,对于C/C++,入栈顺序是从左向右依次入栈。因为两个形参计算顺序之间没有顺序点(sequence point),所以这里计算顺序就看编译器了,不过经测试VS2013是由左向右。
参考博客:
(http://blog.csdn.net/rainkin1993/article/details/8126237) very well
(http://www.cnblogs.com/biyeymyhjob/archive/2012/07/20/2601204.html)
(http://www.cnblogs.com/easonliu/p/4224120.html)

五、函数参数的返回问题
函数的返回值存在哪儿了呢?
(http://blog.csdn.net/natsu1211/article/details/8558163)

六、其他的参考进阶博客
(http://blog.csdn.net/feixiaoxing/article/details/6998116)

你可能感兴趣的:(函数调用和赋值运算)