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

woaidongmao

文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數據加載中……

static 變量初始化順序引發的bug

沒想到會遇到這樣的問題,

在VC6環境下測試,重點請看紅色字體與圖片。

 

#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成員不計入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 肥仔 閱讀(3472) 評論(14)  編輯 收藏 引用 所屬分類: C++ 基礎

評論

# re: static 變量初始化順序引發的bug  回復  更多評論   

這都什么啊……
類靜態成員變量是鏈接進代碼段的東西,同一個類中靜態成員變量的地址沒有誰向你保證過會連續的,三個變量三個完全不相干的地址都是完全合理的,你應該反思的是從一個靜態成員地址反推其他靜態成員地址這種完全不符合邏輯的做法。
另外,你的p_self->val_a之所以合法是因為它看的只是p_self的類型,編譯的時候發現是靜態成員就直接換成實際地址了。
你可以把
Self_Ptr p_self = (Self_Ptr)&(sData::text);
換成
Self_Ptr p_self = NULL;
結果是一樣的。
2008-12-03 22:56 | RedNax

# re: static 變量初始化順序引發的bug  回復  更多評論   

@RedNax
如果我沒有記錯的話
class不是POD,即使是非靜態成員,也不能保證連續,標準沒有這樣的規定。
成員為內置內型或POD類型且同時沒有成員函數的struct可以歸為POD了,標準規定POD內存必須連續,有static成員的struct還算不算POD,這個我倒是不知道。
2008-12-03 23:17 | 肥仔

# re: static 變量初始化順序引發的bug  回復  更多評論   

@RedNax
right, 你的判斷正確,換成Self_Ptr p_self = NULL; p_self->val_a不會內存訪問違規,說明編譯期已經替換了p_self->val_a。
2008-12-03 23:38 | 肥仔

# re: static 變量初始化順序引發的bug  回復  更多評論   

@RedNax
根據你的提示,測試了另一個種情況,證明內存確實不連續,與定義順序相關 +編譯器相關。

我找到了一種強制內存連續的辦法,接口轉換也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 變量初始化順序引發的bug  回復  更多評論   

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

// #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 變量初始化順序引發的bug  回復  更多評論   

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

因為項目中需要提供一個這樣的能力:有幾百個全部是static成員的struct,它們只有最后一個字段是個POD數組,長度會不同,需要有一個統一的接口來訪問這些struct的成員,所以做了這個測試。

2008-12-04 10:35 | 肥仔

# re: static 變量初始化順序引發的bug  回復  更多評論   

C++的意愿是希望大家不要太關注內存的布局,各個編譯器的內存布局都是不太一樣的。

標準規定POD內存必須連續
----------------------
C++標準嗎?98年的時候和VC6一起出現,VC6能支持同一時期出現的標準?很明顯不能。用VC6的話,就不要把C++標準扯嘴上了。
2008-12-04 11:47 | guest

# re: static 變量初始化順序引發的bug  回復  更多評論   

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



2008-12-04 12:19 | 肥仔

# re: static 變量初始化順序引發的bug  回復  更多評論   

關于靜態成員的引用,“p_self->val_a”這種寫法雖然語法上沒有問題,但是一般編譯器都會直接認為是“sData::val_a”,所以肯定沒有問題。
而“p_other->val_a”出現了問題,確實是因為內存有不連續的現象。static成員在運行時有可能是放到代碼段里的,其具體規劃很顯然會受編譯器和操作系統的影響;而一個普通的結構題變量實際上是連續的放在棧里的。
2008-12-04 13:21 | abettor

# re: static 變量初始化順序引發的bug  回復  更多評論   

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

# re: static 變量初始化順序引發的bug  回復  更多評論   

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

交流需要平等,干嘛老擺個姿態呢,我覺得不好。
2008-12-05 18:44 | 肥仔

# re: static 變量初始化順序引發的bug  回復  更多評論   

不知道博主又從那句話看出來本人好為人師了?我說話一直就是這個樣子,你要是不喜歡,覺得我說的話沒有參考價值,都是P話,盡管刪了好了,反正這是你的地盤。

說實話,上篇文章看你做把ASSERT和if綁在一起的傻事,自己把網頁一關就算了,管我P事。可偏偏又覺得不指出來,看著別人以做傻事為榮看不下去,結果好了,倒給博主卯上了。對我提了建議不入耳不說,還扣個帽子“擺姿態”。心想算了,多一事不如少一事。今天轉博客又轉到這里,看到這篇莫名其妙的代碼再加上對VC的偏見,氣又不打一出來。好吧,寫兩句說說。博主又說沒參考意義,再扣個帽子“好為人師”。博主,既然你覺得我們是在交流,請拿出你對我留言的看法來先,技術層面上的,不要先對人打上標記帶上偏見,好嗎?

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

# re: static 變量初始化順序引發的bug  回復  更多評論   

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

我必須得承認,你很強,你問的問題讓我不知所措,我非常地茫然,幾乎無地自容。當然不會刪你的留言,只要不是粗痞話,我都不會刪。大俠的更要留著偶爾看看,好讓自己感到自卑。

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

送客了,遠方的客人請您別再來~~~,:)


2008-12-05 21:00 | 肥仔

# re: static 變量初始化順序引發的bug[未登錄]  回復  更多評論   

。。。。。。。。。。。
路過。。。。。。。。。
。。。。。。。。。。。
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>
            亚洲成人在线观看视频| 香蕉成人啪国产精品视频综合网| 最新日韩av| 亚洲黑丝一区二区| 亚洲精品日韩激情在线电影| 亚洲人体偷拍| 亚洲一区免费在线观看| 亚洲欧美日韩国产精品 | 欧美日韩性生活视频| 欧美激情视频在线播放| 欧美日本在线看| 国产精品久久久久久久久果冻传媒| 欧美亚韩一区| 国产综合av| 亚洲开发第一视频在线播放| aa级大片欧美| 欧美在线视频播放| 免费日韩视频| 99精品热视频只有精品10| 午夜老司机精品| 欧美国产日本高清在线| 国产精品日本精品| 亚洲黄页视频免费观看| 午夜精品成人在线| 蜜臀av性久久久久蜜臀aⅴ| 亚洲精品久久久久| 亚洲综合色网站| 裸体丰满少妇做受久久99精品| 欧美日本亚洲| 亚洲国语精品自产拍在线观看| 亚洲欧美中文日韩v在线观看| 玖玖玖免费嫩草在线影院一区| 亚洲精品欧美在线| 久久久噜噜噜久久中文字免| 欧美视频一区| 亚洲欧洲日产国码二区| 久久久久**毛片大全| 99re国产精品| 欧美电影专区| 尤物99国产成人精品视频| 亚洲在线免费观看| 亚洲国产精品久久久久婷婷884 | 另类综合日韩欧美亚洲| 国产一区二区久久精品| 欧美中文日韩| 欧美午夜片欧美片在线观看| 国产手机视频精品| 亚洲免费网址| 亚洲精品免费一二三区| 老司机久久99久久精品播放免费 | 欧美成人精品在线视频| 性视频1819p久久| 国产精品美女| 亚洲欧美精品| 在线一区亚洲| 国产精品v片在线观看不卡| 日韩午夜在线播放| 欧美电影免费观看大全| 久久精品一区二区三区不卡牛牛| 国产精品视频久久一区| 午夜精品久久久久久久99樱桃 | 亚洲免费电影在线观看| 欧美成人激情视频| 美女视频黄免费的久久| 在线 亚洲欧美在线综合一区| 久久九九国产精品| 久久精品99久久香蕉国产色戒| 国产日韩精品久久| 久久精品亚洲精品国产欧美kt∨| 性欧美videos另类喷潮| 国产亚洲日本欧美韩国| 久久久久国产一区二区三区| 欧美一区二区三区视频在线| 国外视频精品毛片| 免费成人av资源网| 欧美韩国一区| 亚洲综合日本| 先锋影音网一区二区| 国内精品一区二区| 欧美韩日一区二区三区| 欧美日本高清| 久久福利影视| 欧美丰满少妇xxxbbb| 亚洲曰本av电影| 久久www成人_看片免费不卡| 亚洲国产成人91精品| 日韩视频永久免费观看| 国产精品久久一级| 久久综合给合| 欧美日韩精品免费看| 久久国产88| 欧美va天堂| 午夜精品久久久久久久久| 久久av红桃一区二区小说| 最新中文字幕一区二区三区| 亚洲免费av观看| 国产一区二区三区免费不卡| 欧美激情久久久| 国产精品日本一区二区 | 久久国产66| 毛片一区二区三区| 日韩视频在线一区| 亚洲视频视频在线| 今天的高清视频免费播放成人| 免费亚洲一区二区| 欧美日韩在线播放一区| 毛片一区二区三区| 国产精品久久久久久妇女6080| 狂野欧美激情性xxxx| 欧美精品色综合| 欧美尤物巨大精品爽| 另类成人小视频在线| 午夜精品福利在线| 欧美精品三级在线观看| 久久久之久亚州精品露出| 欧美精品乱码久久久久久按摩| 麻豆91精品91久久久的内涵| 国产精品福利网站| 亚洲精品免费电影| 亚洲国产清纯| 欧美一区二区三区视频免费| 亚洲性视频网站| 欧美好骚综合网| 欧美成人一区在线| 韩日午夜在线资源一区二区| 亚洲一区二区在线免费观看| 亚洲图片激情小说| 欧美日韩精品欧美日韩精品一 | 亚洲一区在线播放| 亚洲天堂免费观看| 欧美精品aa| 亚洲高清自拍| 18成人免费观看视频| 久久黄金**| 久久综合久久综合久久| 国产在线乱码一区二区三区| 午夜视频一区| 久久综合狠狠综合久久综青草| 国产色爱av资源综合区| 午夜免费在线观看精品视频| 欧美一区二区三区免费视| 国产精品一级久久久| 亚洲女人av| 久久久久久久久久久久久9999 | 欧美精品亚洲精品| 亚洲国内精品在线| 日韩视频精品在线| 欧美日韩国产精品一卡| 日韩一区二区电影网| 亚洲午夜精品久久久久久app| 欧美亚洲成人精品| 性色av一区二区三区| 老司机精品导航| 亚洲国产精品热久久| 欧美成人高清视频| 日韩亚洲欧美一区| 欧美影院成年免费版| 一区二区三区在线高清| 欧美成人精品福利| 在线亚洲伦理| 久久影院亚洲| 99国产精品久久| 国产精品国产三级国产aⅴ无密码| 亚洲国产精品久久久久秋霞影院 | 亚洲制服欧美中文字幕中文字幕| 亚洲视频一二区| 国产农村妇女毛片精品久久麻豆| 欧美亚洲网站| 欧美大片在线观看| 中文在线资源观看网站视频免费不卡| 国产精品av一区二区| 欧美在线观看天堂一区二区三区 | 午夜精品久久久久久久久久久久 | 亚洲日本电影| 香蕉亚洲视频| 亚洲黄色在线看| 国产精品手机在线| 欧美成人午夜77777| 在线亚洲伦理| 欧美国产日本韩| 欧美一区免费| 一本色道久久加勒比88综合| 国产一区二区三区久久久久久久久| 欧美激情精品久久久久久久变态 | 亚洲高清视频一区| 欧美视频免费| 欧美暴力喷水在线| 欧美在线视频网站| 艳女tv在线观看国产一区| 久久全国免费视频| 一区二区三区回区在观看免费视频 | 欧美国产日产韩国视频| 午夜精品剧场| 亚洲精品看片| 激情综合自拍| 国产亚洲毛片在线| 国产精品视频在线观看| 欧美日韩国产美| 另类成人小视频在线| 欧美自拍偷拍午夜视频|