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

woaidongmao

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

C++中使用union的幾點思考

大衛(wèi)注:
這段時間整理舊資料,看到一些文章,雖然講的都是些小問題,不大可能用到,但也算是一個知識點,特整理出來與大家共享.與此相關(guān)的那篇文章的作者的有些理解是錯誤的,我寫此文,也是糾正為了作者的一些錯誤認識.當(dāng)然,如果我的理解有任何錯誤,也懇請大家批評指正.

C++
雖說被B.S.稱作一門新語言,但它畢竟與C有著千絲萬縷的聯(lián)系,雖然B.S.一再堅持,但我還是愿意把C++看作是C ++.
我們應(yīng)該按照C中的convention去使用union,這是我這篇文章要給出的觀點.雖然C++使得我們可以擴展一些新的東西進去,但是,我建議你不要那樣去做,看完這篇文章之后,我想你大概也是這么想的.

C
由于沒有類的概念,所有類型其實都可以看作是基本類型的組合,因此在union中包含struct也就是一件很自然的事情了,到了C++之后,既然普遍認為C++中的structclass基本等價,那么union中是否可以有類成員呢?先來看看如下的代碼:

struct
TestUnion
{

    TestUnion() {}
};


typedef union

{

    TestUnion obj;
}
UT;

int
main (void)
{

    return
0;
}


編譯該程序,我們將被告知:
error C2620: union '__unnamed' : member 'obj' has user-defined constructor or non-trivial default constructor
而如果去掉那個什么也沒干的構(gòu)造函數(shù),則一切OK.

為什么編譯器不允許我們的union成員有構(gòu)造函數(shù)呢?我無法找到關(guān)于這個問題的比較權(quán)威的解釋,對這個問題,我的解釋是:
如果C++標(biāo)準(zhǔn)允許我們的union有構(gòu)造函數(shù),那么,在進行空間分配的時候要不要執(zhí)行這個構(gòu)造函數(shù)呢?如果答案是yes,那么如果TestUnion的構(gòu)造函數(shù)中包含了一些內(nèi)存分配操作,或者其它對整個application狀態(tài)的修改,那么,如果我今后要用到obj的話,事情可能還比較合理,但是如果我根本就不使用obj這個成員呢?由于obj的引入造成的對系統(tǒng)狀態(tài)的修改顯然是不合理的;反之,如果答案是no,那么一旦我們今后選中了obj來進行操作,則所有信息都沒有初始化(如果是普通的struct,沒什么問題,但是,如果有虛函數(shù)呢?).更進一步,假設(shè)現(xiàn)在我們的union不是只有一個TestUnion obj,還有一個TestUnion2 obj2,二者均有構(gòu)造函數(shù),并且都在構(gòu)造函數(shù)中執(zhí)行了一些內(nèi)存分配的工作(甚至干了很多其它事情),那么,如果先構(gòu)造obj,后構(gòu)造obj2,則執(zhí)行的結(jié)果幾乎可以肯定會造成內(nèi)存的泄漏.
鑒于以上諸多麻煩(可能還有更多麻煩),在構(gòu)造union,編譯器只負責(zé)分配空間,而不負責(zé)去執(zhí)行附加的初始化工作,為了簡化工作,只要我們提供了構(gòu)造函數(shù),就會收到上面的error.
同理,除了不能加構(gòu)造函數(shù),析構(gòu)函數(shù)/拷貝構(gòu)造函數(shù)/賦值運算符也是不可以加.

此外,如果我們的類中包含了任何virtual函數(shù),編譯時,我們將收到如下的錯誤信息:
error C2621: union '__unnamed' : member 'obj' has copy constructor

所以,打消在union中包含有構(gòu)造函數(shù)/析構(gòu)函數(shù)/拷貝構(gòu)造函數(shù)/賦值運算符/虛函數(shù)的類成員變量的念頭,老老實實用你的C風(fēng)格struct!
不過,定義普通的成員函數(shù)是OK,因為這不會使得classC風(fēng)格的struct有任何本質(zhì)區(qū)別,你完全可以將這樣的class理解為一個C風(fēng)格的struct + n個全局函數(shù).

現(xiàn)在,再看看在類中包含內(nèi)部union時會有什么不同.看看下面的程序,并請注意閱讀程序提示:

class
TestUnion
{

    union
DataUnion
    {

        DataUnion(const char*);
        DataUnion(long);
        const
char* ch_;
        long
       l_;
    }
data_;

public
:
    TestUnion(const char* ch);
    TestUnion(long l);
};


TestUnion::TestUnion(const char* ch) : data_(ch) // if you want to use initialzing list to initiate a nested-union member, the union must not be anonymous and must have a constructor.
{
}


TestUnion::TestUnion(long l) : data_(l)
{
}


TestUnion::DataUnion::DataUnion(const char* ch) : ch_(ch)
{
}


TestUnion::DataUnion::DataUnion(long l) : l_(l)
{
}


int
main (void)
{

    return
0;
}


正如上面程序所示,C++中的union也可以包含構(gòu)造函數(shù),但是,這雖然被語言所支持,但實在是一種不佳的編程習(xí)慣,因此,我不打算對上面的程序進行過多的說明.我更推薦如下的編程風(fēng)格:

class
TestUnion
{

    union
DataUnion
    {

        const
char* ch_;
        long
       l_;
    }
data_;
   
public
:
    TestUnion(const char* ch);
    TestUnion(long l);
};


TestUnion::TestUnion(const char* ch)
{

    data_.ch_ = ch;
}


TestUnion::TestUnion(long l)
{

    data_.l_ = l;
}


int
main (void)
{

    return
0;
}


它完全是C風(fēng)格的.

所以,接受這個結(jié)論吧:
請按照C中的convention去使用union,盡量不要嘗試使用任何C++附加特性.

posted on 2004-11-12 09:08 大衛(wèi)的思維空間 閱讀(8069) 評論(16)  編輯 收藏

# "比較權(quán)威的解釋", B.S權(quán)威不?可惜你不看他的書。

以下摘自《 the c++ programming language 3rd 》,對為什么union不支持構(gòu)造函數(shù)和析構(gòu)函數(shù),推薦怎么使用unions都有說明。

10.4.12
Unions [class.union]
A named union is defined as a struct, where every member has the same address (see §C.8.2). A
union can have member functions but not static members.
In general, a compiler cannot know what member of a union is used; that is, the type of the
object stored in a union is unknown. Consequently, a union may not have members with constructors
or destructors. It wouldn’t be possible to protect that object against corruption or to guarantee
that the right destructor is called when the union goes out of scope.
Unions are best used in lowlevel
code, or as part of the implementation of classes that keep
track of what is stored in the union (see §10.6[20]).

其實正如在vckbase/c++論壇上我對你說的,想想union的用途就可以了。union的出現(xiàn)是為了解決一組不定類型數(shù)據(jù)的空間緊張問題,它是為省空間用的,不是為了封裝數(shù)據(jù)和方法。所以我覺得大衛(wèi)兄太過于刨根究底了,而忽略了C++的實用性(實用性是C/C++的首要設(shè)計思想)

2004-11-12 10:18 | 一笑

# re: (大衛(wèi)的閱讀筆記)C++中使用union的幾點思考

謝謝笑兄給出的CPL中的相關(guān)論述.我現(xiàn)在主要關(guān)注的內(nèi)容并非C++(雖然C++是我最喜歡的語言),我在blog上發(fā)布這些文章也只是希望談一下自己對于某些語言特性或新技術(shù)的認識,以期對后來者有些許幫助,同時,也希望在與大家的交流中提高自己.
^_^,
也許我真的有點刨根究底,不過笑兄的關(guān)于"union是為省空間用的"的觀點我不認同,雖然,我也看到過類似的說法,但是,union怎么可能節(jié)省空間呢?:
union uT
{
int i;
char c;
};
當(dāng)他被作為char使用時,明明浪費了空間.
只是從另一角度出發(fā):把它當(dāng)成一種特殊的struct,struct相比時才可以勉強說是節(jié)省了空間.
我認為union的引入,更多地是提供了一種解決多種型別共同使用同一空間(這與節(jié)省空間是兩回事)的機制,借助這種機制,我們可以提供更豐富的語言表現(xiàn)力.
為此,我決定再寫一篇文章,談一些比較有意思/有意義的union的使用,請關(guān)注 & 批評指正.

2004-11-13 05:11 | Bill David

# union的進一步認識與一些深層應(yīng)用[TrackBack]

Ping Back來自:blog.csdn.net
Bill David
引用了該文章,地址:http://blog.csdn.net/billdavid/archive/2004/11/26/195006.aspx

2004-11-26 18:58 | Bill David

# re: (大衛(wèi)的閱讀筆記)C++中使用union的幾點思考

呵呵,仁者見仁,智者見智。
但是union的確應(yīng)該是節(jié)省空間使用的。當(dāng)時的初衷是這樣的。但是后來就不一定了。3ks 二位。

2005-04-19 17:38 | 漫天飛舞

# 今日經(jīng)論壇匿名大俠指點,union還有一個重要的特性

union不支持繼承。

特記錄于此。

2005-04-19 17:59 | Bill David

# re: union不支持繼承。

我突然覺得如果union設(shè)計為可繼承的也未嘗不可。
union base
{
    int mem1;
    char mem2;
};
這個假設(shè)被原實現(xiàn)者設(shè)計好了,突然,某天我想在base的基礎(chǔ)上添加一些特性,于是我寫
union derive : base
{
    short mem 3;
};
或許可能實際意義不大吧!但,如果這么說,我reinterpret_cast成員mem1呢?union的實際意義又有多大呢?

不知道你怎么看?

2006-05-16 13:35 | 清風(fēng)雨

# re: union的幾點思考

又看了你的另一篇union的,可能我比較懶惰的緣故,我只得到一個結(jié)論: union僅僅只是為了方便。

2006-05-16 13:49 | 清風(fēng)雨

# re: (大衛(wèi)的閱讀筆記)C++中使用union的幾點思考

這都是些什么?

2006-05-18 21:35 | 一二三

# re: (大衛(wèi)的閱讀筆記)C++中使用union的幾點思考

看不懂

2006-05-18 21:36 | 一二三

# re: (大衛(wèi)的閱讀筆記)C++中使用union的幾點思考

union
{
    struct
           {
                string name;
           }info;
    int  age;
}information;

上面的語句可能出錯,has copy constructor.   難道只有把string -->char *??

2006-07-07 15:38 | Tmin

# re: (大衛(wèi)的閱讀筆記)C++中使用union的幾點思考

看了文章和回帖,我非常同意一笑兄的看法。我覺得作者沒有完全理解節(jié)省空間的指的是如何節(jié)省,例如我們獲取一些信息時,需要把信息數(shù)據(jù)填充到一個結(jié)構(gòu)中,但是我們需要的信息的數(shù)據(jù)的類型會根據(jù)情況不同而不同,如果我們?yōu)榱送ㄓ玫脑挘赡芫托枰獮樗锌赡艹霈F(xiàn)的類型都預(yù)留相應(yīng)的空間來存儲,但是每次只能使用其中一個有效。其他預(yù)留無效。這顯然是浪費空間的。所以union使得不同類型數(shù)據(jù)存放在內(nèi)存的同一個位置,當(dāng)然這個空間的大小是能容納所有類型的數(shù)據(jù)的。因為unicon的數(shù)據(jù)類型是運行時決定的,事先并不知道,所以為union做一個構(gòu)造函數(shù)是沒有意義的。

2006-10-17 11:48 | hoodlum

# re: (大衛(wèi)的閱讀筆記)C++中使用union的幾點思考

剛才回的倉促,可能有論述不是很恰當(dāng)。但是看了作者的另一篇文章里面引用的英文,論述的也和我本來的想法是一致的。也就是說,可以使用union.memberData來訪問成員,但是應(yīng)該注意的是,使用時只有其中一個成員才是有意義的。union占用的空間大小是所有成員數(shù)據(jù)大小的最小公倍數(shù)。(因此,轉(zhuǎn)為托管代碼中就可以使用一個能夠容納union大小的數(shù)據(jù)類型來代替,或者用通用的字節(jié)數(shù)組)

例如下面的例子(來自Windows API):
union
{    
   DWORD dwOemId;    
   struct {
                 WORD wProcessorArchitecture; 
                 WORD wReserved; 
              };
  };

它通常占用4個字節(jié),因此可以使用托管代碼中的Int32來代替。
其中dwOemId是為了向前兼容某些系統(tǒng)版本,當(dāng)前已經(jīng)棄用。這樣,一個程序?qū)?span lang="EN-US">API
的調(diào)用可以在不同版本的系統(tǒng)中運轉(zhuǎn)良好,處理各自自己需要的數(shù)據(jù)。

 

posted on 2008-11-21 22:07 肥仔 閱讀(2303) 評論(1)  編輯 收藏 引用 所屬分類: C++ 基礎(chǔ)

評論

# re: C++中使用union的幾點思考  回復(fù)  更多評論   

# re: (大衛(wèi)的閱讀筆記)C++中使用union的幾點思考
看了文章和回帖,我非常同意一笑兄的看法。我覺得作者沒有完全理解“節(jié)省空間”的指的是如何節(jié)省,例如我們獲取一些信息時,需要把信息數(shù)據(jù)填充到一個結(jié)構(gòu)中,但是我們需要的信息的數(shù)據(jù)的類型會根據(jù)情況不同而不同,如果我們?yōu)榱送ㄓ玫脑?,可能就需要為所有可能出現(xiàn)的類型都預(yù)留相應(yīng)的空間來存儲,但是每次只能使用其中一個有效。其他預(yù)留無效。這顯然是浪費空間的。所以union使得不同類型數(shù)據(jù)存放在內(nèi)存的同一個位置,當(dāng)然這個空間的大小是能容納所有類型的數(shù)據(jù)的。因為unicon的數(shù)據(jù)類型是運行時決定的,事先并不知道,所以為union做一個構(gòu)造函數(shù)是沒有意義的。

2006-10-17 11:48 | hoodlum
------------------------------------------------
個人覺得hoodlum說得非常好!
2010-05-11 10:55 | Coastline
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            99riav1国产精品视频| 亚洲高清123| 欧美中文日韩| 久久国产精品电影| 久久精品亚洲一区| 六月婷婷久久| 欧美国产视频在线观看| 国产视频综合在线| 黄色成人av在线| 亚洲国产一区二区三区高清| 亚洲日本va午夜在线影院| 亚洲日本电影| 亚洲一区二区四区| 久久久久久久综合色一本| 欧美激情精品久久久久久久变态| 亚洲国产精品va在线观看黑人| 欧美激情一区二区久久久| 亚洲精品一区二区三区在线观看 | 欧美在线91| 久久久久久九九九九| 欧美激情视频一区二区三区免费| 一道本一区二区| 欧美一区二区三区视频在线 | av成人福利| 久久精品国产清自在天天线| 亚洲大片精品永久免费| 亚洲午夜久久久久久久久电影院 | 亚洲精品在线一区二区| 欧美夜福利tv在线| 欧美日韩精品一区二区在线播放| 国产午夜精品美女毛片视频| 亚洲免费观看在线视频| 久久精品一区二区三区不卡牛牛| 最新国产成人av网站网址麻豆| 亚洲免费视频成人| 欧美激情一区| 在线看片成人| 久久九九国产| 亚洲视频播放| 欧美日韩成人网| 亚洲高清不卡av| 久久精品国语| 亚洲一区二区三区四区视频 | 午夜精品久久久久久久99樱桃| 欧美成人免费网站| 樱桃国产成人精品视频| 久久av红桃一区二区小说| 99在线观看免费视频精品观看| 美女日韩在线中文字幕| 激情综合在线| 久久精品国产69国产精品亚洲| 99综合视频| 欧美日韩综合在线| 在线一区免费观看| 日韩视频永久免费观看| 欧美巨乳在线观看| 国产伦一区二区三区色一情| 久久久噜噜噜| 国产日韩在线不卡| 小黄鸭精品密入口导航| 亚洲深夜福利在线| 国产精品xxxxx| 亚洲一区二区精品在线观看| 亚洲麻豆一区| 欧美色播在线播放| 亚洲天堂av电影| 亚洲一卡二卡三卡四卡五卡| 欧美私人网站| 欧美在线亚洲综合一区| 欧美一区二区三区在线看| 国产自产高清不卡| 久久久久久久综合色一本| 久久精品免费电影| 亚洲第一精品在线| 亚洲韩国青草视频| 欧美视频中文字幕| 久久精品国产久精国产一老狼| 欧美一区二区三区精品| 一区在线影院| 亚洲国产视频一区二区| 欧美午夜精品久久久久免费视| 性色av一区二区三区在线观看| 午夜精品一区二区三区四区| 国内自拍视频一区二区三区| 欧美暴力喷水在线| 欧美日韩中文精品| 久久精品99国产精品| 久久综合电影| 亚洲天天影视| 久久久精品动漫| 日韩亚洲欧美综合| 小处雏高清一区二区三区| 亚洲高清视频中文字幕| 99热这里只有成人精品国产| 狠狠88综合久久久久综合网| 亚洲欧洲一区二区三区在线观看| 国产精品欧美日韩一区二区| 久久婷婷丁香| 欧美午夜精品久久久久久超碰| 久久精品123| 欧美精品久久久久久久| 久久精品一区| 欧美性片在线观看| 欧美国产欧美综合| 国产农村妇女毛片精品久久麻豆 | 欧美国产乱视频| 国产精品高潮呻吟久久| 欧美va亚洲va日韩∨a综合色| 欧美午夜激情视频| 欧美国产成人精品| 国产一区二区三区精品欧美日韩一区二区三区 | 国产精品porn| 奶水喷射视频一区| 国产美女精品一区二区三区 | 久久精品国产99国产精品| 艳妇臀荡乳欲伦亚洲一区| 久久久夜精品| 久久久久综合| 国产精品日韩一区二区三区| 亚洲乱亚洲高清| 亚洲人午夜精品免费| 欧美一区二区视频免费观看| 亚洲一区二区三区高清| 欧美精品在线极品| 欧美国产激情| 亚洲激情女人| 欧美+日本+国产+在线a∨观看| 久久亚洲欧美国产精品乐播| 国产偷久久久精品专区| 亚洲视频一二区| 亚洲男人第一av网站| 欧美图区在线视频| 中文亚洲视频在线| 亚洲一区免费在线观看| 欧美日韩国产一区二区| 亚洲区一区二区三区| 亚洲精品一区二区三区四区高清| 老司机精品久久| 亚洲成人在线网站| 日韩一本二本av| 欧美日韩国产一区二区三区| 亚洲精品一区二区三区樱花| 亚洲视频免费在线观看| 欧美日韩精品欧美日韩精品| 99国产精品99久久久久久粉嫩 | 亚洲午夜视频在线观看| 欧美美女日韩| 亚洲精品社区| 亚洲午夜视频| 国产美女精品一区二区三区 | 欧美午夜久久| 亚洲欧美文学| 免费成人高清| 日韩亚洲成人av在线| 欧美视频国产精品| 亚洲综合日韩| 久久亚洲欧美| 99国产精品99久久久久久粉嫩 | 久久在线免费观看视频| 欧美激情欧美狂野欧美精品 | 免费成人高清视频| 一区二区三区日韩欧美| 国产精品色网| 久久躁日日躁aaaaxxxx| 亚洲精品中文在线| 久久久久.com| 日韩手机在线导航| 国产欧美日韩高清| 欧美大片91| 午夜一区二区三区不卡视频| 亚洲韩国日本中文字幕| 久久精品二区| 亚洲激情视频在线观看| 欧美在线黄色| 亚洲激情av在线| 国产精品网站在线播放| 猫咪成人在线观看| 亚洲一区视频| 91久久精品国产91久久性色| 午夜精品一区二区三区在线视| 精品不卡一区二区三区| 欧美色精品天天在线观看视频 | 欧美一区二区三区成人| 亚洲第一精品福利| 国产精品免费电影| 欧美福利视频在线| 久久精品观看| 亚洲一区二区三区影院| 亚洲精华国产欧美| 久久亚洲免费| 久久国产日韩| 亚洲免费影视第一页| 日韩一级在线观看| 亚洲国产精品一区在线观看不卡| 国产精品亚洲一区二区三区在线| 欧美精品免费看| 免费在线看成人av| 亚洲一级影院| 亚洲色在线视频| 亚洲精品女人|