woaidongmao

文章均收录自他人博客,但不喜标题前加-[转贴],因其丑陋,见谅!~
随笔 - 1469, 文章 - 0, 评论 - 661, 引用 - 0
数据加载中……

inline函数包涵static变量,调用时是否同样会有多份拷贝?

inline   int   static_test()  
  {  
        static   int   i   =0;  
        ...  
  }  
  inline   代表编译时代码拷贝,也就有多份副本了,但本人在VC中测试,i只有一份副本,它是怎样实现的呢? 问题点数:20、回复次数:12Top

1 楼megaboy(飞天御剑流之杀神一刀斩)回复于 2005-08-26 23:40:10 得分 4

内联函数在调用时是用函数体中的内容代替函数调用,如果在多个地方使用了static_test(),就会有多条static   int   i=0;的语句,因为它们是一样的,编译器只会保留第一个,其余忽略。Top

2 楼yeahsuetsing(破刀)回复于 2005-08-26 23:42:01 得分 2

代码拷贝不一定是c代码的拷贝吧,可以是编译后的汇编代码的拷贝。而函数在代码段,变量则在数据段。拷贝的只是代码段中的函数部分。Top

3 楼Darkay_Lee()回复于 2005-08-26 23:49:13 得分 4

编译器给静态变量安置到数据区就可以了,数据区的初始值就是初始化时候的值,在static函数里面就忽略那个初始化的语句。Top

4 楼xinxiakk(特亚)回复于 2005-08-26 23:55:47 得分 2

static   变量有拷贝吗?  
  我印象里好像没有的说Top

5 楼zhouhuahai(道号"虚无")回复于 2005-08-27 09:53:42 得分 4

static变量不是放在栈里的,是放在静态数据区.和全局变量存放在一起.  
  不能将它和局部变量混为一谈Top

6 楼zousoft(菜菜鸟的战斗诗歌)回复于 2005-08-27 12:36:07 得分 0

static只初始化一次Top

7 楼jiajun2001(Jagen(嘉俊))回复于 2005-08-27 14:41:10 得分 0

static放在全局数据区Top

8 楼yingle2000(音乐天堂)回复于 2005-08-27 16:24:32 得分 0

如果inline包含变量声明,编译器就不会作为inline处理吧?普通函数的static只初始化一次。Top

9 楼husl(胡少磊)回复于 2005-08-27 22:57:05 得分 4

    更哪个inline没关系吧   ,    
  inline   主要是为了省去调用函数时   对主掉函数的现场和返回地址的保存等   ,来减少调用函数的开销  
  并且   是由编译器决定是否将用户定义的内联函数作为真正的内联函数处理,所以它应该不回改变  
  调用函数的一些东西吧   我也说不清   也就说应该和非内联函数效果是一样的    
  另外    
  //关于静态变量  
  #include<IOSTREAM>  
  using   namespace   std;  
  inline   void   fun()  
  {  
  static   int   a   =   0;  
  cout   <<     "a   is"   <<   ++a   <<endl;  
  }  
  int   main()  
  {  
  fun();  
  fun();  
  return   0;  
  }  
  输出的   1   ,2   是预期结果  
  而  
  int   main()  
  {  
          {  
        static   int   a   =   0;  
        cout   <<     "a   is"   <<   ++a   <<endl;  
            }  
            {  
      static   int   a   =   0;  
        cout   <<     "a   is"   <<   ++a   <<endl;  
            }  
  return   0;  
  }  
  输出的是   1   ,1  
  这一点可以看出   调用含有静态变量的函数并不像调用一般的函数   一般的函数可以直接把  
  代码贴过去   结果是一样的   而上面的结果不一样  
Top

10 楼husl(胡少磊)回复于 2005-08-27 22:59:08 得分 0

  为啥子   高人能解释一下吗?Top

11 楼SammyLan((基础决定你能走多远)--英语菜才是真的菜)回复于 2005-08-28 00:46:39 得分 0

int     Rand()  
  //生成SIZE位的随机数0<(SIZE<10)  
  //返回一个各位数都不相同的随机数  
  {  
          static   int   ver[SIZE];  
          static   int   size=SIZE;  
          static   bool   bInit=false;  
          if   (!bInit)   {  
                  srand(unsigned(time(0)));  
                  bInit=true;  
                  for   (int   i=0;i<size;++i)   {  
                  ver[i]=i+1;  
                    }  
            }  
            if   (!size)   {  
                size=SIZE;  
            }  
            int   i=rand()%size;  
            int   _Rand=ver[i];  
            --size;  
            ver[i]=ver[size];  
            ver[size]=_Rand;  
            return   _Rand   ;    
  }  
  这个是最好的   (=_=)Top

12 楼SammyLan((基础决定你能走多远)--英语菜才是真的菜)回复于 2005-08-28 00:47:08 得分 0

发错地方   (=_=)  

posted on 2009-10-14 15:25 肥仔 阅读(1815) 评论(1)  编辑 收藏 引用 所属分类: C++ 基础

评论

# re: inline函数包涵static变量,调用时是否同样会有多份拷贝?  回复  更多评论   

我顶你!转载的文章写的很好,“因其丑陋,见谅” 帅气!
2009-10-14 17:08 | blocker

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理