inline int static_test()
{
static int i =0;
...
}
inline 代表編譯時代碼拷貝,也就有多份副本了,但本人在VC中測試,i只有一份副本,它是怎樣實(shí)現(xiàn)的呢? 問題點(diǎn)數(shù):20、回復(fù)次數(shù):12Top
1 樓megaboy(飛天御劍流之殺神一刀斬)回復(fù)于 2005-08-26 23:40:10 得分 4
內(nèi)聯(lián)函數(shù)在調(diào)用時是用函數(shù)體中的內(nèi)容代替函數(shù)調(diào)用,如果在多個地方使用了static_test(),就會有多條static int i=0;的語句,因?yàn)樗鼈兪且粯拥?,編譯器只會保留第一個,其余忽略。Top
2 樓yeahsuetsing(破刀)回復(fù)于 2005-08-26 23:42:01 得分 2
代碼拷貝不一定是c代碼的拷貝吧,可以是編譯后的匯編代碼的拷貝。而函數(shù)在代碼段,變量則在數(shù)據(jù)段。拷貝的只是代碼段中的函數(shù)部分。Top
3 樓Darkay_Lee()回復(fù)于 2005-08-26 23:49:13 得分 4
編譯器給靜態(tài)變量安置到數(shù)據(jù)區(qū)就可以了,數(shù)據(jù)區(qū)的初始值就是初始化時候的值,在static函數(shù)里面就忽略那個初始化的語句。Top
4 樓xinxiakk(特亞)回復(fù)于 2005-08-26 23:55:47 得分 2
static 變量有拷貝嗎?
我印象里好像沒有的說Top
5 樓zhouhuahai(道號"虛無")回復(fù)于 2005-08-27 09:53:42 得分 4
static變量不是放在棧里的,是放在靜態(tài)數(shù)據(jù)區(qū).和全局變量存放在一起.
不能將它和局部變量混為一談Top
6 樓zousoft(菜菜鳥的戰(zhàn)斗詩歌)回復(fù)于 2005-08-27 12:36:07 得分 0
static只初始化一次Top
7 樓jiajun2001(Jagen(嘉俊))回復(fù)于 2005-08-27 14:41:10 得分 0
static放在全局?jǐn)?shù)據(jù)區(qū)Top
8 樓yingle2000(音樂天堂)回復(fù)于 2005-08-27 16:24:32 得分 0
如果inline包含變量聲明,編譯器就不會作為inline處理吧?普通函數(shù)的static只初始化一次。Top
9 樓husl(胡少磊)回復(fù)于 2005-08-27 22:57:05 得分 4
更哪個inline沒關(guān)系吧 ,
inline 主要是為了省去調(diào)用函數(shù)時 對主掉函數(shù)的現(xiàn)場和返回地址的保存等 ,來減少調(diào)用函數(shù)的開銷
并且 是由編譯器決定是否將用戶定義的內(nèi)聯(lián)函數(shù)作為真正的內(nèi)聯(lián)函數(shù)處理,所以它應(yīng)該不回改變
調(diào)用函數(shù)的一些東西吧 我也說不清 也就說應(yīng)該和非內(nèi)聯(lián)函數(shù)效果是一樣的
另外
//關(guān)于靜態(tài)變量
#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 是預(yù)期結(jié)果
而
int main()
{
{
static int a = 0;
cout << "a is" << ++a <<endl;
}
{
static int a = 0;
cout << "a is" << ++a <<endl;
}
return 0;
}
輸出的是 1 ,1
這一點(diǎn)可以看出 調(diào)用含有靜態(tài)變量的函數(shù)并不像調(diào)用一般的函數(shù) 一般的函數(shù)可以直接把
代碼貼過去 結(jié)果是一樣的 而上面的結(jié)果不一樣
Top
10 樓husl(胡少磊)回復(fù)于 2005-08-27 22:59:08 得分 0
為啥子 高人能解釋一下嗎?Top
11 樓SammyLan((基礎(chǔ)決定你能走多遠(yuǎn))--英語菜才是真的菜)回復(fù)于 2005-08-28 00:46:39 得分 0
int Rand()
//生成SIZE位的隨機(jī)數(shù)0<(SIZE<10)
//返回一個各位數(shù)都不相同的隨機(jī)數(shù)
{
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((基礎(chǔ)決定你能走多遠(yuǎn))--英語菜才是真的菜)回復(fù)于 2005-08-28 00:47:08 得分 0
發(fā)錯地方 (=_=)