非静态函数,非静态变量与静态函数,静态变量

本文探讨了内联函数和宏函数如何减少调用开销,提升程序效率,并详细介绍了静态函数的应用场景,如Windows回调函数、线程控制及系统API的使用。同时提供了具体的C++示例代码。

一、函数

函数的引入可以减少程序的目标代码,实现程序代码的共享。但是,函数调用也需要一些时间和空间方面的开销,因为调用函数实际上将程序执行流程转移到被调函数中,被调函数的程序代码执行完后,再返回到调用的地方。这种调用操作要求调用前保护现场并记忆执行的地址,返回后恢复现场,并按原来保存的地址继续执行。对于较长的函数这种开销可以忽略不计,但是对于一些函数体代码很短,但又被频繁地调用的函数,就不能忽视这种开销。引入内联函数和宏函数正是为了解决这个问题,提高程序的运行效率。   

在程序编译时,编译器将程序中出现的内联函数(宏函数)的调用表达式用内联函数(宏函数)的函数体来进行替换。由于在编译时将函数体中的代码替代到程序中,因此会增加目标程序代码量,进而增加空间开销,而在时间开销上不象函数调用时那么大,可见它是以目标代码的增加为代价来换取时间的节省。
在类静态数据成员不同于非静态的数据成员,一个类的静态数据成员仅创建和初始化一次,且在程序开始执行的时候创建,然后被该类的所有对象共享;而非静态的数据成员则随着对象的创建而多次创建和初始化; static成员是放在静态存储区的,它并不受访问控制符的限制,而其它的成员变量则是放在栈中的。

二、使用方面

1:windows的回调函数使用静态函数:

在类中,static型的成员函数,由于是类所拥有的,而不是具体对象所有的,这一点对于windows的回调机制非常有用。因为对于回调函数而言,windows不会借助任何对象去调用它,也就不会传递this指针,那么对于一般成员函数作为回调函数的后果,就是堆栈中有一个随机的变量会成为this指针,这当然会引发程序的崩溃。而static函数,由于是整个类的,屏蔽了this指针。因此,如果成员函数作为回调函数,就应该用static去修饰它。

2:线程控制函数常使用静态函数
静态函数有特定的地址空间,这样可以避免在运行时system对内存调整带来的问题。

3:Windows系统API,也常使用静态函数

调用方面,不用在调用前实例化。

三、实例代码

#include  " stdafx.h "
#include 
< windows.h >
#include 
< stdio.h >
#include 
< string .h >
class  Directory
{
public:
      
// 静态公有的函数
      Directory()
      
{
           strcpy(strTemp,
"/测试");
           i
=15;
      }

      
static void setpath(char const *newpath);
      
static void setname( Directory *dir);
      
void getpath(char *oldpath);
      
char strTemp [50];
      
int i;
private:
      
      
//静态字符串
      static char path [];
      
}
;
 
// 静态数据成员的初始化
char  Directory::path [ 199 =   " /开始测试 " ;
 
//  静态函数访问静态变量
void  Directory::setpath( char   const   * newpath)
{
      printf(
"path=%s\n",path);
      strncpy(path, newpath, 
199);
      printf(
"path=%s\n",path);
}
 
// 静态函数访问非静态变量
void  Directory::setname(Directory  * dir)
{
      dir
->getpath("/静态函数访问非静态函数");
    dir
->strTemp;//静态函数访问非静态变量
      return;
}

//  非静态函数访问静态变量
void  Directory::getpath( char   * oldpath)
{   
      strncpy(Directory::path,oldpath, 
199);
      printf(
"Directory::path=%s\n",Directory::path);
}
 
 
//  使用实例
void  main()
{

      
// 通过类名调用setpath()成员函数
    
//Directory::setpath("/通过类名调用静态成员函数");
      
      
//通过对象调用setpath()成员函数
      Directory dir;
      
      dir.setpath(
"/静态函数访问静态变量");
      dir.getpath(
"/非静态函数访问静态变量");
      Directory 
*dira;
      dir.setname(dira);
      
}


本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/shuigsls/archive/2008/07/13/2645918.aspx

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值