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
发错地方 (=_=)