青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見(jiàn)諒!~
隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
數(shù)據(jù)加載中……

static 變量初始化順序引發(fā)的bug

沒(méi)想到會(huì)遇到這樣的問(wèn)題,

在VC6環(huán)境下測(cè)試,重點(diǎn)請(qǐng)看紅色字體與圖片。

 

#include "stdafx.h"

#include <stdio.h>

 

typedef struct sData

{

    static const char* text;

    static int  val_a;

    static int  val_b;

} sData, *Self_Ptr;

 

typedef struct 

{

    char* text;

    int val_a;

    int val_b;

}* Other_Ptr;

 

 

const char* sData::text = "this is a test string\0";

int   sData::val_b = 200;

int   sData::val_a = 100;

 

int main(int argc, char* argv[])

{

    Self_Ptr p_self = (Self_Ptr)&(sData::text);

    Other_Ptr p_other = (Other_Ptr)&(sData::text);

    printf("%d\n", sizeof(sData));                          //----1, static成員不計(jì)入sizeof

    printf("val_a: %d-%d\n", p_self->val_a, sData::val_a);  //----val_a: 100-100

    printf("val_b: %d-%d\n", p_self->val_b, sData::val_b);  //----val_b: 200-200

    printf("val_a: %d-%d\n", p_self->val_a, p_other->val_a);//----val_a: 100-200

    printf("val_b: %d-%d\n", p_self->val_b, p_other->val_b);//----val_b: 200-100

    return 0;

}

 

image

posted on 2008-12-03 21:38 肥仔 閱讀(3464) 評(píng)論(14)  編輯 收藏 引用 所屬分類(lèi): C++ 基礎(chǔ)

評(píng)論

# re: static 變量初始化順序引發(fā)的bug  回復(fù)  更多評(píng)論   

這都什么啊……
類(lèi)靜態(tài)成員變量是鏈接進(jìn)代碼段的東西,同一個(gè)類(lèi)中靜態(tài)成員變量的地址沒(méi)有誰(shuí)向你保證過(guò)會(huì)連續(xù)的,三個(gè)變量三個(gè)完全不相干的地址都是完全合理的,你應(yīng)該反思的是從一個(gè)靜態(tài)成員地址反推其他靜態(tài)成員地址這種完全不符合邏輯的做法。
另外,你的p_self->val_a之所以合法是因?yàn)樗吹闹皇莗_self的類(lèi)型,編譯的時(shí)候發(fā)現(xiàn)是靜態(tài)成員就直接換成實(shí)際地址了。
你可以把
Self_Ptr p_self = (Self_Ptr)&(sData::text);
換成
Self_Ptr p_self = NULL;
結(jié)果是一樣的。
2008-12-03 22:56 | RedNax

# re: static 變量初始化順序引發(fā)的bug  回復(fù)  更多評(píng)論   

@RedNax
如果我沒(méi)有記錯(cuò)的話
class不是POD,即使是非靜態(tài)成員,也不能保證連續(xù),標(biāo)準(zhǔn)沒(méi)有這樣的規(guī)定。
成員為內(nèi)置內(nèi)型或POD類(lèi)型且同時(shí)沒(méi)有成員函數(shù)的struct可以歸為POD了,標(biāo)準(zhǔn)規(guī)定POD內(nèi)存必須連續(xù),有static成員的struct還算不算POD,這個(gè)我倒是不知道。
2008-12-03 23:17 | 肥仔

# re: static 變量初始化順序引發(fā)的bug  回復(fù)  更多評(píng)論   

@RedNax
right, 你的判斷正確,換成Self_Ptr p_self = NULL; p_self->val_a不會(huì)內(nèi)存訪問(wèn)違規(guī),說(shuō)明編譯期已經(jīng)替換了p_self->val_a。
2008-12-03 23:38 | 肥仔

# re: static 變量初始化順序引發(fā)的bug  回復(fù)  更多評(píng)論   

@RedNax
根據(jù)你的提示,測(cè)試了另一個(gè)種情況,證明內(nèi)存確實(shí)不連續(xù),與定義順序相關(guān) +編譯器相關(guān)。

我找到了一種強(qiáng)制內(nèi)存連續(xù)的辦法,接口轉(zhuǎn)換也OK,但代碼不好看了,如下:


#include "stdafx.h"
#include <stdio.h>

typedef struct
{
struct __Data
{
char* text;
int val_a;
int val_b;
} static data;

} sData, *Self_Ptr;

typedef struct
{
char* text;
int val_a;
int val_b;
}* Other_Ptr;

sData::__Data sData::data
={ "this is a test string\0", 100, 200};

int main(int argc, char* argv[])
{
Self_Ptr p_self = 0;
Other_Ptr p_other = (Other_Ptr)&(sData::data.text);
printf("%d\n", sizeof(sData));
printf("val_a: %d-%d\n", p_self->data.val_a, sData::data.val_a);
printf("val_b: %d-%d\n", p_self->data.val_b, sData::data.val_b);
printf("val_a: %d-%d\n", p_self->data.val_a, p_other->val_a);
printf("val_b: %d-%d\n", p_self->data.val_b, p_other->val_b);
return 0;
}
2008-12-04 00:03 | 肥仔

# re: static 變量初始化順序引發(fā)的bug  回復(fù)  更多評(píng)論   

還是搞不懂你這樣做是什么意思,要好看這樣就可以了吧:

// #include "stdafx.h"
#include <stdio.h>


typedef struct
{
char* text;
int val_a;
int val_b;
}__Data, *Other_Ptr;

typedef struct sData
{
static __Data data;
} *Self_Ptr;

__Data sData::data
={ "this is a test string\0", 100, 200};

int main(int argc, char* argv[])
{
Self_Ptr p_self = 0;
Other_Ptr p_other = (Other_Ptr)&(sData::data);
printf("%d\n", sizeof(sData));
printf("val_a: %d-%d\n", p_self->data.val_a, sData::data.val_a);
printf("val_b: %d-%d\n", p_self->data.val_b, sData::data.val_b);
printf("val_a: %d-%d\n", p_self->data.val_a, p_other->val_a);
printf("val_b: %d-%d\n", p_self->data.val_b, p_other->val_b);
return 0;
}
2008-12-04 00:52 | RedNax

# re: static 變量初始化順序引發(fā)的bug  回復(fù)  更多評(píng)論   

@RedNax
?? 有差別嗎? 代碼不好看,我指p_self->data.val_a,多了一個(gè)data,能夠去掉這個(gè)data就好看了。

因?yàn)轫?xiàng)目中需要提供一個(gè)這樣的能力:有幾百個(gè)全部是static成員的struct,它們只有最后一個(gè)字段是個(gè)POD數(shù)組,長(zhǎng)度會(huì)不同,需要有一個(gè)統(tǒng)一的接口來(lái)訪問(wèn)這些struct的成員,所以做了這個(gè)測(cè)試。

2008-12-04 10:35 | 肥仔

# re: static 變量初始化順序引發(fā)的bug  回復(fù)  更多評(píng)論   

C++的意愿是希望大家不要太關(guān)注內(nèi)存的布局,各個(gè)編譯器的內(nèi)存布局都是不太一樣的。

標(biāo)準(zhǔn)規(guī)定POD內(nèi)存必須連續(xù)
----------------------
C++標(biāo)準(zhǔn)嗎?98年的時(shí)候和VC6一起出現(xiàn),VC6能支持同一時(shí)期出現(xiàn)的標(biāo)準(zhǔn)?很明顯不能。用VC6的話,就不要把C++標(biāo)準(zhǔn)扯嘴上了。
2008-12-04 11:47 | guest

# re: static 變量初始化順序引發(fā)的bug  回復(fù)  更多評(píng)論   

@guest
汗,VC6如果對(duì)POD這樣的標(biāo)準(zhǔn)都支持不了,那就太那個(gè)。
VC6一直在用,而且最近1~2年內(nèi)應(yīng)該還是會(huì)作為工作的首選,沒(méi)覺(jué)得有什么不好。賽揚(yáng)CPU,512MB的內(nèi)存,開(kāi)4個(gè)VC6 IDE,并行開(kāi)發(fā)一點(diǎn)都不卡,舒舒服服。
AMD雙核,2G內(nèi)存,打開(kāi)一個(gè)VS 2008,只聽(tīng)到硬盤(pán)狂叫,10秒以上才能出個(gè)界面,這就是.net的效果?。
上次CSDN看到一個(gè)投票,目前C++集成開(kāi)發(fā)環(huán)境,10年了的VC6占30%多,依然居第一位。



2008-12-04 12:19 | 肥仔

# re: static 變量初始化順序引發(fā)的bug  回復(fù)  更多評(píng)論   

關(guān)于靜態(tài)成員的引用,“p_self->val_a”這種寫(xiě)法雖然語(yǔ)法上沒(méi)有問(wèn)題,但是一般編譯器都會(huì)直接認(rèn)為是“sData::val_a”,所以肯定沒(méi)有問(wèn)題。
而“p_other->val_a”出現(xiàn)了問(wèn)題,確實(shí)是因?yàn)閮?nèi)存有不連續(xù)的現(xiàn)象。static成員在運(yùn)行時(shí)有可能是放到代碼段里的,其具體規(guī)劃很顯然會(huì)受編譯器和操作系統(tǒng)的影響;而一個(gè)普通的結(jié)構(gòu)題變量實(shí)際上是連續(xù)的放在棧里的。
2008-12-04 13:21 | abettor

# re: static 變量初始化順序引發(fā)的bug  回復(fù)  更多評(píng)論   

@肥仔
代碼里的問(wèn)題和static變量初始化順序沒(méi)有關(guān)系...
編譯器是編譯器,編輯器是編輯器,雖然微軟把他們綁成一個(gè)VC扔給博主,但博主最好還是把他們分清楚。喜歡VC6編輯器資源消耗小,沒(méi)問(wèn)題,你就一直用VC6的IDE寫(xiě)代碼;喜歡VC 2008的編譯器支持C++新標(biāo)準(zhǔn),沒(méi)問(wèn)題,你就直接在在命令行用VC 2008的編譯器編譯就行了。不矛盾也不沖突。
2008-12-05 16:47 | helpsoff.com.cn

# re: static 變量初始化順序引發(fā)的bug  回復(fù)  更多評(píng)論   

@helpsoff.com.cn
呵呵,這不是我們第一次交流了,你這位同志比較喜歡好為人師嘛。但是需要說(shuō)出點(diǎn)稍微有參考價(jià)值的東西,才可以教育別人,是不是。

交流需要平等,干嘛老擺個(gè)姿態(tài)呢,我覺(jué)得不好。
2008-12-05 18:44 | 肥仔

# re: static 變量初始化順序引發(fā)的bug  回復(fù)  更多評(píng)論   

不知道博主又從那句話看出來(lái)本人好為人師了?我說(shuō)話一直就是這個(gè)樣子,你要是不喜歡,覺(jué)得我說(shuō)的話沒(méi)有參考價(jià)值,都是P話,盡管刪了好了,反正這是你的地盤(pán)。

說(shuō)實(shí)話,上篇文章看你做把ASSERT和if綁在一起的傻事,自己把網(wǎng)頁(yè)一關(guān)就算了,管我P事??善钟X(jué)得不指出來(lái),看著別人以做傻事為榮看不下去,結(jié)果好了,倒給博主卯上了。對(duì)我提了建議不入耳不說(shuō),還扣個(gè)帽子“擺姿態(tài)”。心想算了,多一事不如少一事。今天轉(zhuǎn)博客又轉(zhuǎn)到這里,看到這篇莫名其妙的代碼再加上對(duì)VC的偏見(jiàn),氣又不打一出來(lái)。好吧,寫(xiě)兩句說(shuō)說(shuō)。博主又說(shuō)沒(méi)參考意義,再扣個(gè)帽子“好為人師”。博主,既然你覺(jué)得我們是在交流,請(qǐng)拿出你對(duì)我留言的看法來(lái)先,技術(shù)層面上的,不要先對(duì)人打上標(biāo)記帶上偏見(jiàn),好嗎?

回到我上一條留言,我想問(wèn)問(wèn)你,你真的弄清楚,裝完VC后,哪塊是編輯器,哪塊是編譯器鏈接器,哪塊是開(kāi)發(fā)包了嗎?
2008-12-05 19:33 | helpsoff.com.cn

# re: static 變量初始化順序引發(fā)的bug  回復(fù)  更多評(píng)論   

@helpsoff.com.cn
呵呵,好了。

我必須得承認(rèn),你很強(qiáng),你問(wèn)的問(wèn)題讓我不知所措,我非常地茫然,幾乎無(wú)地自容。當(dāng)然不會(huì)刪你的留言,只要不是粗痞話,我都不會(huì)刪。大俠的更要留著偶爾看看,好讓自己感到自卑。

這既然是一個(gè)你不屑的地方,就不必再來(lái)了吧,何必來(lái)看這么膚淺的文章影響了您老人家的心情?

送客了,遠(yuǎn)方的客人請(qǐng)您別再來(lái)~~~,:)


2008-12-05 21:00 | 肥仔

# re: static 變量初始化順序引發(fā)的bug[未登錄](méi)  回復(fù)  更多評(píng)論   

。。。。。。。。。。。
路過(guò)。。。。。。。。。
。。。。。。。。。。。
2008-12-07 11:22 | cppexplore
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久九九全国免费精品观看| 黄色成人免费观看| 亚洲一区二区精品在线观看| 亚洲精品日日夜夜| 亚洲精品极品| 日韩视频国产视频| 亚洲欧洲三级| 日韩一区二区精品葵司在线| 亚洲图片在线| 久久精品国产久精国产一老狼| 久久综合久久久久88| 亚洲大片精品永久免费| 一区二区三区免费在线观看| 午夜免费在线观看精品视频| 久久综合久久综合久久| 欧美日韩精品免费在线观看视频| 模特精品在线| 国产精品久久久久秋霞鲁丝| 极品尤物av久久免费看| 亚洲免费观看高清完整版在线观看熊 | 久久这里有精品视频| 欧美激情中文字幕一区二区 | 国产精品视频不卡| 亚洲电影天堂av| 午夜精品福利一区二区三区av| 欧美一级片久久久久久久| 免费视频一区| 亚洲欧美国产视频| 欧美人与禽性xxxxx杂性| 国产亚洲精品一区二区| 一区二区三区.www| 免费看亚洲片| 亚洲欧美另类久久久精品2019| 欧美一区二区三区四区在线| 欧美日韩性生活视频| 韩国一区二区三区在线观看| 亚洲伊人网站| 亚洲精品美女| 久久精品亚洲国产奇米99| 国产精品嫩草99av在线| 夜夜精品视频| 亚洲国产精品久久久久| 久久精品视频亚洲| 亚洲精品日产精品乱码不卡| 久久这里有精品15一区二区三区| 国产精品久久久久久久久久ktv| 伊人久久大香线蕉综合热线| 欧美一区二区三区视频免费播放| 亚洲国产成人91精品| 久久久久看片| 伊人伊人伊人久久| 久久视频在线视频| 久久国产精品72免费观看| 国产欧美精品日韩精品| 欧美一区二区大片| 午夜精品久久久99热福利| 国产精品午夜视频| 午夜久久资源| 欧美亚洲网站| 国内精品视频在线播放| 久久深夜福利| 久久嫩草精品久久久精品| 影音先锋成人资源站| 麻豆av一区二区三区| 久久久伊人欧美| 91久久精品日日躁夜夜躁欧美 | 久久全国免费视频| 久久久不卡网国产精品一区| 国语自产精品视频在线看| 久久久久成人精品| 欧美在线你懂的| 永久域名在线精品| 亚洲国产裸拍裸体视频在线观看乱了中文 | 国产美女精品一区二区三区| 亚洲女人天堂av| 亚洲特色特黄| 国产欧美日韩专区发布| 久久久噜久噜久久综合| 久久一区二区精品| 日韩视频免费在线| 亚洲一区国产精品| 激情成人在线视频| 亚洲人成网站精品片在线观看| 欧美女同视频| 久久www成人_看片免费不卡| 久久亚洲不卡| 亚洲私人影院在线观看| 欧美一进一出视频| 日韩一级大片在线| 亚洲影院在线观看| 最新日韩在线视频| 午夜精品久久久久久久久久久久| 国语自产精品视频在线看8查询8| 欧美国产亚洲另类动漫| 欧美日韩精品伦理作品在线免费观看| 欧美性淫爽ww久久久久无| 久久国产精品免费一区| 欧美成年视频| 欧美一区二区免费观在线| 久久夜色精品| 欧美亚洲自偷自偷| 欧美大片91| 久久xxxx精品视频| 欧美日韩精品免费观看| 蜜臀av国产精品久久久久| 国产精品久久福利| 亚洲国产高清一区二区三区| 国产欧美日韩综合| 日韩视频中午一区| 亚洲国产精品久久久久秋霞蜜臀| 日韩午夜视频在线观看| 樱桃视频在线观看一区| 亚洲欧美一区二区在线观看| 日韩香蕉视频| 米奇777在线欧美播放| 久久精品一区二区三区四区 | 久久综合电影一区| 羞羞答答国产精品www一本| 免费黄网站欧美| 久久久久久尹人网香蕉| 国产精品美腿一区在线看| 亚洲国产人成综合网站| 亚洲第一视频| 久久理论片午夜琪琪电影网| 久久精品视频导航| 国产精品综合不卡av| 中文在线资源观看视频网站免费不卡| 国产欧美日韩视频一区二区| 夜夜嗨网站十八久久| 亚洲精品你懂的| 欧美插天视频在线播放| 女同性一区二区三区人了人一 | 国产精品视区| 一区二区精品在线| 亚洲午夜国产成人av电影男同| 欧美1区免费| 亚洲国产电影| 99re66热这里只有精品3直播| 久久一区欧美| 欧美激情视频在线免费观看 欧美视频免费一 | 欧美日本亚洲| 亚洲精品一区二区在线观看| 一区二区高清| 欧美视频在线观看| 一区二区三区四区五区精品| 亚洲男人第一av网站| 国产精品丝袜91| 久久福利精品| 亚洲欧洲视频在线| 亚洲精品自在久久| 亚洲一区黄色| 国产乱码精品| 久久精品国产精品| 欧美va天堂| 一区二区三区免费观看| 国产精品九九| 久久成人一区二区| 亚洲国产日韩欧美| 中文久久乱码一区二区| 国产精品美女久久久久久2018| 亚洲九九爱视频| 午夜精品久久久久| 精品69视频一区二区三区| 欧美二区在线| 亚洲欧美另类综合偷拍| 欧美不卡在线视频| 亚洲在线视频免费观看| 精品动漫3d一区二区三区| 欧美人在线观看| 欧美在线视频不卡| 亚洲精品视频在线观看免费| 久久国产精品久久国产精品 | 美女国产一区| 这里只有精品视频| 免费看亚洲片| 亚洲欧美日本日韩| 亚洲国产高潮在线观看| 国产精品久久久久久久第一福利| 欧美一区二区三区婷婷月色| 亚洲国产日韩一级| 久久久久久久久久久久久9999| 亚洲日韩视频| 好看不卡的中文字幕| 欧美视频亚洲视频| 免费日韩av| 久久成人免费视频| 亚洲一区国产一区| 亚洲日本欧美在线| 欧美不卡三区| 久久婷婷国产综合国色天香| 亚洲欧美国产毛片在线| av不卡免费看| 亚洲精品三级| 亚洲国产乱码最新视频| 黑丝一区二区| 国产亚洲欧美一区二区| 国产精品中文字幕欧美| 国产精品久久精品日日| 欧美日韩国产综合网| 欧美成人日韩|