游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4998|回复: 11

C++中Static的局部变量是编译时属性还是运行时属性

[复制链接]

18

主题

573

帖子

573

积分

高级会员

Rank: 4

积分
573
发表于 2004-11-10 20:41:00 | 显示全部楼层 |阅读模式
最近有个兄弟问我:“局部变量的static属性是编译时属性还是运行时”,我想了一下,回答道:

“局部的static变量的生命期是静态生命期,所以应该是个编译时属性”,他满意的回去了,我却

陷入了沉思,靠,从来没想过这种问题,所以,索性写了个测试程序,片段如下:

void foo(void)
{
    char str[] = "I love china!";
    cout <<str<<endl;
}

void foo2(void)
{
    static char str[] = "I love you!";
    cout <<str<<endl;
}

void main(void)
{
    foo();
    foo2();
}

然后分别在两个函数前面放了个断点,运行程序,切换到汇编模式,发现了如下的问题:
1、foo函数中的str是个局部变量,也就是说它是在栈上建立的(不要打我),运行函数时,编译器生成了一段代码,将“I love china!”的内容拷贝到str中,然后才显示,而且每次调用foo函
数,都会拷贝一次;但是在foo2中,显示时直接引用的是一段内存的地址,也就是“I loveyou!
”的地址,也就是说在程序运行前这个字符串已经被编译器初始化好了!
2、所以,基于以上的测试,我想局部变量的static属性是编译时属性。
3、还好我说对了,那位兄弟不要骂我呀!
4、所以才明白为什么许多的大师在函数里使用一个大的结构或者字符串时,都要将其定义成static属性了。
5、希望得到大家的点评!

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2004-11-10 21:05:00 | 显示全部楼层

Re:C++中Static的局部变量是编译时属性还是运行时属性

是运行期的,在程序运行的时候初始化。。
不过似乎在某些情况下是在第一次访问到的时候才会初始化。

1

主题

8

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2004-11-10 21:41:00 | 显示全部楼层

Re:C++中Static的局部变量是编译时属性还是运行时属性

Static的局部变量其生存期是全局的,可见区在函数内。

1

主题

60

帖子

60

积分

注册会员

Rank: 2

积分
60
发表于 2004-11-10 23:13:00 | 显示全部楼层

Re: Re:C++中Static的局部变量是编译时属性还是运行时属性

tarkey: Re:C++中Static的局部变量是编译时属性还是运行时属性

是运行期的,在程序运行的时候初始化。。
不过似乎在某些情况下是在第一次访问到的时候才会初始化。


这个问题很复杂,牵涉到作用域/构造函数等等的相互作用。一般而言,局部的static变量在第一次访问时初始化,全局static简单变量在编译时初始化。静态类对象被组织成一个链,在一个编译器或库中指定的例程中初始化。详细描述这个问题,需要在一本深入一点的C++书里占去一章篇幅。针对自己用的编译器写几段测试代码看看吧。

33

主题

669

帖子

669

积分

高级会员

Rank: 4

积分
669
QQ
发表于 2004-11-11 10:53:00 | 显示全部楼层

Re:C++中Static的局部变量是编译时属性还是运行时属性

是编译器属性吧

30

主题

276

帖子

276

积分

中级会员

Rank: 3Rank: 3

积分
276
发表于 2004-11-11 20:38:00 | 显示全部楼层

Re:C++中Static的局部变量是编译时属性还是运行时属性

4、所以才明白为什么许多的大师在函数里使用一个大的结构或者字符串时,都要将其定义成static属性了。
---------------这个原因是 结构和系统类型都不使用构造函数的 ..static实际就是个全局变量,只是编译器编译的时候把名字限定在局部范围. 这样用是为了避免使用全局变量的名字冲突.
但是对于有构造函数的 类 使用static是有负担的,既每次运行总要检查是否为第一次执行,以便执行构造函数.
所以对于类而言,速度上是 全局变量>static,能够隔离名字的同样还有 namespace 里的全局变量,但static有着第一次调用时构造的特性,某些模式依赖于这种特性.

18

主题

573

帖子

573

积分

高级会员

Rank: 4

积分
573
 楼主| 发表于 2004-11-11 23:00:00 | 显示全部楼层

Re:C++中Static的局部变量是编译时属性还是运行时属性

1、我的理解是不管是怎么样的static变量,编译器都会对其作些手脚,如果是个类或者结构,就在程序初始化的代码中插入对其构造函数的调用,如果是简单的变量就将其初始化的代码插入程序的初始化部分,我所谓的编译时属性就是这个意思,就是在编译时有编译器决定这个变量应该放在哪里进行初始化!
2、小陈00这位兄弟的话中有句“速度上是 全局变量>static”,我有些疑惑;全局变量分为初始化的和未初始化的,初始化的全局变量和static型变量一样是放在Data段,而未初始化的全局变量是放在BSS段,就从访问内存的速度而言,大家的访问速度应该是一样的,不存在谁的速度更快!
当然,以上的观点我也是通过看汇编结果才得出的!请大家批评指正!

37

主题

180

帖子

180

积分

注册会员

Rank: 2

积分
180
发表于 2004-11-11 23:33:00 | 显示全部楼层

Re: Re:C++中Static的局部变量是编译时属性还是运行时属性

william9527: Re:C++中Static的局部变量是编译时属性还是运行时属性

1、我的理解是不管是怎么样的static变量,编译器都会对其作些手脚,如果是个类或者结构,就在程序初始化的代...


我觉的是一样的就算是全域变数也是有区域的 "global"
不然在 名称的比对的hashtable 没法找

而区域变数就是用堆叠机分配的了
指令多了点..不过这样才有办法 做递迥

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2004-11-12 00:19:00 | 显示全部楼层

Re:C++中Static的局部变量是编译时属性还是运行时属性

变量和常量都属于运行时分配,编译期能做的只是生成二进制代码。

89

主题

4036

帖子

4132

积分

论坛元老

Rank: 8Rank: 8

积分
4132
发表于 2004-11-12 01:34:00 | 显示全部楼层

Re:C++中Static的局部变量是编译时属性还是运行时属性

都有
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-23 05:39

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表