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
發錯地方 (=_=)