• <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>
            隨筆 - 30, 文章 - 0, 評(píng)論 - 64, 引用 - 0
            數(shù)據(jù)加載中……

            在堆上分配內(nèi)存

            unsigned long *pA = new unsigned long; *pA = 10;
            unsigned long *pB = new unsigned long[ *pA ];

            上面就申請(qǐng)了兩塊內(nèi)存,pA所指的內(nèi)存(即pA的值所對(duì)應(yīng)的內(nèi)存)是4字節(jié)大小,而pB所指的內(nèi)存是4*10=40字節(jié)大小。應(yīng)該注意,由于new是一個(gè)操作符,其結(jié)構(gòu)為new <類型名>[<整型數(shù)字>]。它返回指針類型的數(shù)字,其中的<類型名>指明了什么樣的指針類型,而后面方括號(hào)的作用和定義數(shù)組時(shí)一樣,用于指明元素的個(gè)數(shù),但其返回的并不是數(shù)組類型,而是指針類型。



            delete pA; delete[] pB;

                注意delete操作符并不返回任何數(shù)字,但是其仍被稱作操作符,看起來它應(yīng)該被叫做語句更加合適,但為了滿足其依舊是操作符的特性,C++提供了一種很特殊的數(shù)字類型——void。其表示無,即什么都不是,這在《C++從零開始(七)》中將詳細(xì)說明。因此delete其實(shí)是要返回?cái)?shù)字的,只不過返回的數(shù)字類型為void罷了。

                注意上面對(duì)pA和pB的釋放不同,因?yàn)閜A按照最開始的書寫,是new unsigned long返回的,而pB是new unsigned long[ *pA ]返回的。所以需要在釋放pB時(shí)在delete的后面加上“[]”以表示釋放的是數(shù)組,不過在VC中,不管前者還是后者,都能正確釋放內(nèi)存,無需“[]”的介入以幫助編譯器來正確釋放內(nèi)存,因?yàn)橐訵indows為平臺(tái)而開發(fā)程序的VC是按照Windows操作系統(tǒng)的方式來進(jìn)行內(nèi)存分配的,而Windows操作系統(tǒng)在釋放內(nèi)存時(shí),無需知道欲釋放的內(nèi)存塊的長(zhǎng)度,因?yàn)槠湟呀?jīng)在內(nèi)部記錄下來(這種說法并不準(zhǔn)確,實(shí)際應(yīng)是C運(yùn)行時(shí)期庫干了這些事,但其又是依賴于操作系統(tǒng)來干的,即其實(shí)是有兩層對(duì)內(nèi)存管理的包裝,在此不表)。

            posted @ 2008-11-26 15:40 henry08 閱讀(367) | 評(píng)論 (0)編輯 收藏

            指針

            再來看取內(nèi)容操作符“*”,其右接的數(shù)字類型是指針類型或數(shù)組類型,它的計(jì)算就是將此指針類型的數(shù)字直接轉(zhuǎn)換成地址類型的數(shù)字
            因?yàn)橹羔橆愋偷臄?shù)字和地址類型的數(shù)字在數(shù)值上是相同的,僅僅計(jì)算規(guī)則不同


            地址類型的數(shù)字是在編譯時(shí)期給編譯器用的
            指針類型的數(shù)字是在運(yùn)行時(shí)期給代碼用的

            posted @ 2008-11-26 15:39 henry08 閱讀(182) | 評(píng)論 (0)編輯 收藏

            申請(qǐng)內(nèi)存 靜態(tài)分配動(dòng)態(tài)分配

            在申請(qǐng)內(nèi)存時(shí)總是申請(qǐng)固定大小的內(nèi)存,則稱此內(nèi)存是靜態(tài)分配的。前面提出的定義變量時(shí),編譯器幫我們從棧上分配的內(nèi)存就屬于靜態(tài)分配


            根據(jù)用戶輸入的不同而可能申請(qǐng)不同大小的內(nèi)存時(shí),則稱此內(nèi)存是動(dòng)態(tài)分配的,后面說的從堆上分配就屬于動(dòng)態(tài)分配。


            同樣,靜態(tài)分配的內(nèi)存利用率不高或運(yùn)用不夠靈活,但代碼容易編寫且運(yùn)行速度較快;動(dòng)態(tài)分配的內(nèi)存利用率高,不過編寫代碼時(shí)要復(fù)雜些,需自己處理內(nèi)存的管理(分配和釋放)且由于這種管理的介入而運(yùn)行速度較慢并代碼長(zhǎng)度增加。
            靜態(tài)和動(dòng)態(tài)的意義不僅僅如此,其有很多的深化,如硬編碼和軟編碼、緊耦合和松耦合,都是靜態(tài)和動(dòng)態(tài)的深化。

            posted @ 2008-11-26 15:38 henry08 閱讀(842) | 評(píng)論 (0)編輯 收藏

            字符串

             char類型進(jìn)行表示的字符串稱為單字節(jié)字符串(SingleByte),用這種表示方式記錄的文本文件稱為是ANSI格式的

              多字節(jié)字符串(MultiByte),用這種表示方式記錄的文本文件稱為是MBCS格式的

             寬字節(jié)字符串(WideChar),用這種表示方式記錄的文本文件稱為是Unicode格式的
                     (一個(gè)short類型的數(shù)字來表示,即每個(gè)字符的長(zhǎng)度固定為2字節(jié))

            posted @ 2008-11-26 15:37 henry08 閱讀(200) | 評(píng)論 (0)編輯 收藏

            在線C++編譯器介紹

            下面的網(wǎng)址是最有名的兩個(gè)在線C++編譯網(wǎng)站:

            http://www.dinkumware.com/exam/default.aspx
            http://www.comeaucomputing.com/tryitout/
            許多在線判題系統(tǒng)也可以用來進(jìn)行在線編譯:

            http://acm.zju.edu.cn/
            http://acm.pku.edu.cn/JudgeOnline/
            http://acm.uva.es/
            你可能會(huì)好奇這些網(wǎng)站使用的編譯器的版本和編譯參數(shù)到底是什么。有些網(wǎng)站會(huì)提供這些信息,而有些則不會(huì)。那么你就只能靠自己去發(fā)現(xiàn)這些“秘密”了。

            工欲善其事,必先利其器。讓我們先看看一些從編譯器獲取信息的小技巧。

            1. 輸出宏
            在C++中, 字符串常數(shù)不能作為模板參數(shù)。大多數(shù)編譯器會(huì)在錯(cuò)誤信息中同時(shí)輸出字符串的內(nèi)容。下面的代碼展示了這一技巧。

            template<const char *> class A {};
            #define F0(x) #x
            #define F1(x) F0(x)
            #define V1 F1(__GNUC__)
            int main()
            {
                A<V1> a1;
            }


            這里,宏F0和F1用于將整型轉(zhuǎn)換成字符串。編譯器會(huì)輸出類似于"literal "3" is not a valid template argument because it is the address of an object with static linkage"的出錯(cuò)信息。里面的"3"就是你想知道的宏的內(nèi)容。

            2. 輸出常數(shù)
            同樣,浮點(diǎn)數(shù)是不能作為模板參數(shù)的。編譯器通常會(huì)在錯(cuò)誤信息中包含浮點(diǎn)數(shù)的值。利用這一點(diǎn),我們可以輸出浮點(diǎn)常數(shù)。不過很不幸的是,VC會(huì)隱式的將浮點(diǎn)類型的模板參數(shù)轉(zhuǎn)換成int(參見https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=296008
            下面是一種輸出整型常量的方法:

            template<int N>
            class A
            {
            private:
                A();
            };
            int main()
            {
                A<sizeof(char)> a;
            }


            3. 輸出變量類型
            有時(shí)候,你可能需要知道某些變量的實(shí)際類型,這時(shí)候你可以使用下面的代碼:

            struct Dummy {};
            void Fun(const Dummy &);
            int main()
            {
                Fun(1+1U);
            }


            PS:如果你使用的是gcc,那么它會(huì)輸出"not convert `2' to `const Dummy&'",所以你需要將Fun的聲明改成"template<typename T> void Fun(T);"(換句話說,在gcc中上面的代碼也可以用于輸出常數(shù)的值)

            4. 輸出包含路徑
            如果要獲取STL頭文件的路徑,你可以使用:

            #include <ext/hash_set>
            using __gnu_cxx::hash_set;

            int main()
            {
                hash_set<> m;
            }

             

            PS:這里也可以使用vector。

            好,現(xiàn)在是時(shí)候牛刀小試了。關(guān)于如何獲取編譯器的版本信息,可以參考這篇文章:Pre-defined Compiler Macros

            下面是利用上面介紹的技巧獲得的dinkumware網(wǎng)站的一些資料:

            1. VC
            版本 (_MSC_FULL_VER):
                     VC8 140050727
                     VC7.1 13103077
                     VC7 13009466
                     VC6 12008804
            包含路徑:
                     D:\cplt501_vc_source\include (with _CPPLIB_VER=501)

            2. EDG
            版本(__EDG_VERSION__):
                     3.05 
            編譯參數(shù):
                     edgcc --alt -D_WIN32 -D_M_IX86 --no_inlining --diag_suppress=1290 --long_long --wchar_t_keyword -D_C99 -ID:\cplt501_gen_source/include/c -ID:\cplt501_gen_source/include -IC:\PROGRA~1\MICROS~2.NET\VC7/include --exceptions --microsoft -c sourceFile.cpp
            因?yàn)槭褂昧薞C兼容模式進(jìn)行編譯,所以編譯器可能會(huì)模擬VC的部分bug

            3. GCC
            版本:
                     3.2.0
            包含路徑:
                     D:/cplt501_gen_source/include and D:/Mingw/include/c++/3.2/
            可以看到這里使用的GCC的版本已經(jīng)相當(dāng)陳舊了

             

             

             

             

             

             

             


            文章出處:http://www.diybl.com/course/3_program/c++/cppsl/2008108/149011.html

            posted @ 2008-11-26 12:35 henry08 閱讀(3550) | 評(píng)論 (2)編輯 收藏

            賦值語句

            賦值語句
            因此應(yīng)在變量定義的時(shí)候就進(jìn)行賦值(但是會(huì)有性能上的影響,不過很小),以初始化變量而防止出現(xiàn)莫名其妙的值,在表達(dá)式中運(yùn)用賦值運(yùn)算符是不好的,即使它可能讓你寫出看起來簡(jiǎn)練的語句,但它也使代碼的可維護(hù)性降低。


            true 0
            false 非0

            posted @ 2008-11-26 00:18 henry08 閱讀(947) | 評(píng)論 (0)編輯 收藏

            棧(Stack) 堆(Heap)


            C++即允許程序員有兩種向操作系統(tǒng)申請(qǐng)內(nèi)存的方式。
                前一種就是在棧上分配,申請(qǐng)的內(nèi)存大小固定不變
                后一種是在堆上分配,申請(qǐng)的內(nèi)存大小可以在運(yùn)行的時(shí)候變化,不是固定不變的
            _______+++++++++++++++++++++++++++++++++++_____________________________




            棧(Stack)
                               
                              : 任何程序執(zhí)行前,預(yù)先分配一固定長(zhǎng)度的內(nèi)存空間,
                                這塊內(nèi)存空間被稱作棧,也被叫做堆棧
                                即程序員自己判斷可以使用哪些內(nèi)存,
                                而不是操作系統(tǒng),很明顯,
                               上面的工作是由編譯器來做的,   
                               工作只是從操作系統(tǒng)變到程序自己而已,
                               好處就是由于程序一開始執(zhí)行時(shí)就已經(jīng)分配了一大塊連續(xù)內(nèi)存,
                               壞處也就是只能在編譯時(shí)期分配內(nèi)存


            上面的工作是編譯器做的,即程序員并不參與堆棧的維護(hù)。但上面已經(jīng)說了,堆棧相當(dāng)于在編譯時(shí)期分配內(nèi)存,因此一旦計(jì)算好某塊內(nèi)存的偏移,則這塊內(nèi)存就只能那么大,不能變化了


            __________________________________________________________________________________________________

            堆(Heap)

                            
            在Windows操作系統(tǒng)下,由操作系統(tǒng)分配的內(nèi)存就叫做堆
                             而棧可以認(rèn)為是在程序開始時(shí)就分配的堆
                             因此在堆上就可以分配大小變化的內(nèi)存塊,
                             因?yàn)槭?span style="COLOR: #ff0000">運(yùn)行時(shí)期
            即時(shí)分配的內(nèi)存,
                            而不是編譯時(shí)期已計(jì)算好大小的內(nèi)存塊。

            posted @ 2008-11-24 18:45 henry08 閱讀(1042) | 評(píng)論 (1)編輯 收藏

            挑戰(zhàn)30天C/C++ 入門極限系列教程

            挑戰(zhàn)30天C/C++ 入門極限系列教程

            C++從零開始系列教程目錄
            http://www.bianceng.cn/Programming/cplus/jc/200705/659.htm

            posted @ 2008-11-23 21:56 henry08 閱讀(498) | 評(píng)論 (0)編輯 收藏

            Visual C++ 2005 系列課程學(xué)習(xí)筆記

             

            http://www.cnblogs.com/kai_xin/category/153770.html

            posted @ 2008-11-23 21:38 henry08 閱讀(235) | 評(píng)論 (0)編輯 收藏

            c++ 開blogs

            c++  開blogs

            posted @ 2008-11-11 15:35 henry08 閱讀(165) | 評(píng)論 (0)編輯 收藏

            僅列出標(biāo)題
            共3頁: 1 2 3 
            青青草国产精品久久| 久久青草国产精品一区| 久久精品国产亚洲一区二区三区| 久久se精品一区精品二区| 99久久精品国产免看国产一区| 久久精品国产亚洲av水果派| 国产精品99久久99久久久| 国内精品久久久久久久亚洲| 中文成人久久久久影院免费观看| 性欧美丰满熟妇XXXX性久久久| 成人久久综合网| 日日狠狠久久偷偷色综合免费 | 久久无码AV中文出轨人妻| 久久精品极品盛宴观看| 精品久久久久久无码中文字幕一区| 国内精品九九久久久精品| 女人香蕉久久**毛片精品| 中文字幕久久波多野结衣av| 99久久精品九九亚洲精品| 久久午夜夜伦鲁鲁片免费无码影视| 99热都是精品久久久久久| 久久福利青草精品资源站| 国产亚洲精久久久久久无码| 国产亚洲精午夜久久久久久| 久久精品国产亚洲AV无码娇色| 日韩亚洲国产综合久久久| 一本久久久久久久| AV无码久久久久不卡蜜桃| 亚洲午夜无码久久久久| 一本色道久久88综合日韩精品| 亚洲午夜精品久久久久久人妖| 亚洲中文字幕无码一久久区| 久久乐国产综合亚洲精品| 久久久久久久久久免免费精品| 久久综合丝袜日本网| 国产一久久香蕉国产线看观看| 1000部精品久久久久久久久| 人妻无码αv中文字幕久久 | 91精品国产高清久久久久久国产嫩草 | 久久精品国产亚洲av麻豆蜜芽 | 99久久精品国产高清一区二区|