博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

sislcb

寻找自己
sislcb.cublog.cn
高质量程序设计 --第六章 c/c++函数设计基础
线程函数并不使用普通的函数堆栈,而是使用线程自己的堆栈。线程堆栈是线程在每次启动时动态分配的,这样就可以在线程函数每次执行时使用不同的堆栈,从而避免线程函数执行时流重叠时可能出现的堆栈破坏。
 
程序堆栈是系统为程序分配的一种静态数据区,但是函数堆栈却是在调用到它的时候才动态分配的。
 
函数堆栈主要三个用途:在进入函数前保存环境变量和返回地址,在进入函数时保存实参的拷贝,在函数体内保存局部变量。
 
函数调用规范:
__cdecl:c/c++函数的默认调用规范,参数从右到左依次传递并压入堆栈,用调用函数负责堆栈的清除。
__stdcall:win api的调用规范。参数从右到左依次传递并压入堆栈,用被调用函数负责堆栈的清除。
 
每一个函数原型的调用规范必须与其实现的调用规范保持一致,否则会出现连接出错提示。
 
定义于普通静态函数库(.Lib)和动态函数库(DLL)中的全局数据类型,全局函数,全局变量甚至全局常量,它们的连接规范必须在两端(库和调用端)保持一致。
 
参数传递规则:
如果输入函数以值传递的方式传递对象,则宜改为“const &”,因为引用的创建和销毁不会调用对象的构造和析构函数,从而提高效率。
 
当局部变量和某全局变量重名时,在函数内部将遮蔽全局变量,可以使用::来引用全局变量。
 
递归函数能够成功的原因:
1、函数在进入下一轮递归的时候并没有退出,因此当前堆栈的内容并没有销毁,从而每次递归进入和退出时都能够保证有序的入栈和出栈。
2、函数内的局部变量都时动态创建的,即每次调用进入函数时才创建(压栈),而函数退出时才销毁(出栈),因此能够保证每一次递归返回时局部变量有序的销毁。
3、函数堆栈是自动增长的,理论上只要内存足够,它就能会按需增长,直到达到最大堆栈限制为止(堆栈溢出)
 
使用断言
断言(assert)的语义如下:如果表达式的值为0,则输出错误消息并终止程序的执行。断言失败说明程序中存在一个bug。
assert()在debug版本里有效。
在函数入口处,使用断言来检查参数的有效性。
给assert语句加注释,告诉人们assert语句究竟要做什么。

发表于: 2007-08-30,修改于: 2007-08-31 23:15,已浏览611次,有评论0条 推荐 投诉

给我留言
版权所有 ChinaUnix.net 页面生成时间:0.01205