• <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>

            使用wxWidget中遇到的圖片存儲(chǔ)問題一二

            1. 實(shí)驗(yàn)室中CCD的實(shí)際色階為14位,獲取的原始圖像數(shù)據(jù)的每個(gè)值都存儲(chǔ)在一個(gè)字中,即存儲(chǔ)色階16位,也就是說最高兩位的數(shù)據(jù)一直為0,同時(shí)獲取的圖片信息僅僅是16色階的灰度圖,而采用wxWidget沒有辦法直接將16位的數(shù)值串保存為圖片格式,如tiff格式,那么如何將16位的數(shù)值串以圖片的形式進(jìn)行保存呢?

                經(jīng)過這么幾天的折騰總算是找到了一條解決的途徑,就是將16位的數(shù)值串轉(zhuǎn)化為8為的數(shù)值串,也許你會(huì)很快的想到這么一個(gè)方法,nValue*max(uint8)/max(uint16);用來表示轉(zhuǎn)化后的數(shù)值,不夠還是得考慮一下CCD的實(shí)際色階,由于是14位,因此可以采用這樣的方式nValue*max(uint8)/max(uint14);不過由于我們對(duì)于圖片的處理是直接對(duì)圖片的原始數(shù)據(jù)進(jìn)行處理,而轉(zhuǎn)化只是圖片在顯示屏上顯示的前提步驟,采用上述的方式雖然能夠相對(duì)很準(zhǔn)確的進(jìn)行轉(zhuǎn)化,但是需要花費(fèi)一定的計(jì)算量,而通過近似的轉(zhuǎn)化能夠更快的進(jìn)行這個(gè)轉(zhuǎn)化過程,同時(shí)獲取得到的圖片依然具有較好的清晰度,下面細(xì)說一下我采用的方法:

               1: unsigned short nPicData16 = new unsigned short[nBufSize];   // nBufSize is the size to store pic
               2:  
               3: // to get the nPicData16
               4: // ..................
               5: // get the nPicData16
               6:  
               7: char *pcPicData8 = new char[nBufSize];
               8: for (size_t i = 0; i < nBufSize; ++i) {
               9:   pcPicData8[i] = (char)(nPicData16>>6);
              10: }
              11:  
              12:  

            由于2^6在2^14中所占的比例較小因此可以采用這樣的近似的方法。(這種方法具體有什么作用或是缺陷還沒有細(xì)究,請(qǐng)各位看官給點(diǎn)看法

            2. 順利將14位數(shù)值串轉(zhuǎn)化成為8為數(shù)值串后,嘗試的使用下列方式進(jìn)行圖片保存,發(fā)現(xiàn)結(jié)果一片黑,數(shù)值都為0了:

               1: // 結(jié)果發(fā)現(xiàn)存儲(chǔ)得到的save.bmp圖是24b的
               2: wxBitmap bitmap(pcPicData8,1392,1040,8);
               3: bitmap.SaveFile(wxT("save.bmp"),wxBITMAP_TYPE_BMP);
               4:  

            因此猜想wxWidget對(duì)直接獲取的數(shù)據(jù)串進(jìn)行保存時(shí)采用的rgb的模式進(jìn)行保存,可能只會(huì)保存為24字節(jié)格式的圖片,也就是想要將圖片顯示到屏幕上時(shí),也應(yīng)該采用24b的圖片。不過wxWidget對(duì)于圖片數(shù)據(jù)卻能夠讀取8位的圖片,但是再次采用上述的方式進(jìn)行存儲(chǔ)時(shí),變成了32字節(jié)的了,(各位大蝦知不知道有沒有方法能夠直接保存8位圖的呢)。

            于是采用了將這個(gè)8位的數(shù)值串分別賦值給R,G,B,用這種方式實(shí)現(xiàn)灰度圖的創(chuàng)建,然后再進(jìn)行保存,最終解決了問題。

               1: unsigned char *rgbData = new unsigned char[1392*1040*3];
               2: unsigned char *ptr1 = (unsigned char*) pcPicData8;
               3: unsigned char *ptr2 = rgbData;
               4: for (int i = 0; i < 1392*1040; ++i) {
               5:     *ptr2++ = *ptr1;   
               6:     *ptr2++ = *ptr1;
               7:     *ptr2++ = *ptr1++;
               8: }
               9: wxImage myImage(1392,1040,rgbData);
              10: myImage.SaveFile(wxT("save.bmp"),wxBITMAP_TYPE_BMP);

            posted @ 2012-06-26 17:51 鐘謝偉 閱讀(1927) | 評(píng)論 (12)編輯 收藏

            從自己的角度來看人生路

            從89年到現(xiàn)在,將近23個(gè)春秋了,人生的近三分之一已沒入了歷史的河流中,仿佛一顆塵埃掉入河中,泛不起一絲漣漪。這僅僅是一種不真實(shí)的感受,電影《蝴蝶效應(yīng)》中講述的就與此相反,過去那看似微末的行為,隨著時(shí)間的流逝,卻會(huì)被逐漸放大,帶來預(yù)料之外的影響,但是通過比較,才能清楚的認(rèn)清,變化的大小,而目前時(shí)間流淌的不可逆性,使得這樣的情景注定只能夠在熒屏上展現(xiàn),在腦海中空旋。
            再向前邁出兩步就成為大學(xué)畢業(yè)的人了,四年的大學(xué)生涯也將隨著落幕的鐘聲逐漸遠(yuǎn)去。但是,我覺得這四年中,我不是一個(gè)合格的掌舵人,只是順應(yīng)著波浪,一路中,風(fēng)平浪靜,就仿佛麥哲倫在從南美到菲律賓三個(gè)月的航行中,沒有遇到一次波浪,算是一種運(yùn)氣吧。四年大學(xué)生涯的結(jié)束帶給我的沒有不舍,沒有對(duì)未來更美好的憧憬,只有對(duì)于自己人生路途的茫然,而在武漢更能體會(huì)到內(nèi)外茫然的同步效應(yīng)^^。
            小學(xué)6年,初中3年,高中3年,大學(xué)4年,隨著教育的深入,仿佛感到自己正被某種莫名的東西慢慢的同化著、侵蝕著,從最初的活躍慢慢過度到了淡然的狀態(tài)。這個(gè)深入學(xué)習(xí)的過程仿佛擁有著難以拒絕的“魔力”,不斷的誘惑著你,慢慢的迷失了自己。
            也許是深受中國(guó)古代教育模式的影響,目前雖然在推廣以學(xué)生為主導(dǎo),減負(fù)等措施,但是終究如晚霞般,慢慢的消失,隨之而來的便是無(wú)盡的黑暗。難,改正一個(gè)習(xí)慣難,這是總所周知的,因此想要對(duì)歷史積淀下來的東西進(jìn)行改變更不是輕而易舉的事情。這里并未有批判填鴨式、以課本為主的教育模式,想古代文人主要學(xué)習(xí)的書籍就那么基本,反復(fù)看的也就那么基本,在死記之后仍會(huì)不斷地進(jìn)行摸索、不斷的溫習(xí),而后便會(huì)帶來了悟,轉(zhuǎn)化為自己的東西,而現(xiàn)在呢,知識(shí)的量相比較而言不知增加了多少倍,同時(shí)知識(shí)的更新速度更是猛躥。死記了一部分知識(shí),來未等有足夠的時(shí)間將其消化,便掩埋在了新知識(shí)或是舊的不同的知識(shí)的沙泥中,忘記便是必然的事情。而學(xué)無(wú)所獲的結(jié)果,更會(huì)促使內(nèi)心滋生厭學(xué)的心態(tài),惡性循環(huán)也成為大多數(shù)學(xué)生在經(jīng)歷的一種狀態(tài),心累身累,不如放下,沉溺與游戲中,尋找有所成就的快感。
            同時(shí)有多少人是走著自己喜歡的道路,有多少人認(rèn)清了自己想要走的道路呢?從兒時(shí)開始,由于自己的人生觀,世界觀沒有很好的形成,從而家長(zhǎng)、老師就成了重要的指路人,但是有些家長(zhǎng),將自己的認(rèn)知自己的理解,認(rèn)為就是孩子所需要的,于是各種的培訓(xùn),各種的補(bǔ)習(xí)接踵而至,想讓孩子成為鄰里最出色的一名,相互的比較,用的便是各種的標(biāo)簽,“學(xué)生干部”,“成績(jī)”,“獎(jiǎng)狀”等等。但是往往忽略孩子對(duì)于新鮮的事物總是充滿這好奇,歡喜也許僅僅是一時(shí)的,但如果好好的引導(dǎo),或許能夠成為一種喜好,強(qiáng)加的壓迫卻往往適得其反,就算是能夠獲取所謂的成功,孩子的心中深藏的也許是更深的苦,難言而又長(zhǎng)久。
                高中步入大學(xué)前,首先需要選擇的是具體的專業(yè),但是哪個(gè)專業(yè)是你真的想要選擇的呢,家長(zhǎng)老師開始從就業(yè)情況,大縱好評(píng)度不斷的給你分析,影響著你的選擇,然后聽從他們最終的判決,但是18歲,已經(jīng)成年了的你們是否曾想過先充分認(rèn)清楚自己的追求,然后進(jìn)行選擇呢?也許是小學(xué)、初中、高中這么步步走來的影響,我們已經(jīng)習(xí)慣了從書中,從老師的口中,從家長(zhǎng)的言語(yǔ)中尋求所謂的標(biāo)準(zhǔn)答案,不知道如何通過自身去辨識(shí)屬于自己的方向,我們也慢慢失去了對(duì)于興趣和愛好的感覺,就算迎面相見,也不曾相識(shí),插肩而過,便成陌路客。原來一直都是借口,借口對(duì)前路的未知,借口他人比自己更了解自己,借口在其他人身上存在自己想要的標(biāo)準(zhǔn)答案,就算是自己的父母,有多少能夠知道自己的孩子真正想要的是什么,他們的本意自然不壞,但是幫倒忙的可能也是存在的,并且不小。
                也許是失去了警覺性,在意識(shí)到危險(xiǎn)降臨的時(shí)候,才會(huì)慌張,才會(huì)不知所措,才會(huì)瞎走瞎撞,后悔過后,依然一片晴朗。在沒認(rèn)清自己喜歡干些什么的時(shí)候,進(jìn)入了大學(xué),進(jìn)入了一個(gè)所謂喜歡、所謂很好的專業(yè),開始了大學(xué)生活。上著既定的課程,為了考試,打了興奮劑般的復(fù)習(xí),仿佛這一切都是為了成績(jī)。一個(gè)流程的教學(xué)下來,對(duì)于悲喜的敏感性也越來越差,順應(yīng)著大流忙碌著,上課,游戲,考試等等。就算是那些實(shí)驗(yàn)性的課程也多是走走過場(chǎng),便能輕松的通過。渾渾噩噩,只是不同的人,用不同的渾噩的方式,得到了不同的渾噩的結(jié)果,誰(shuí)都不用羨慕誰(shuí),因?yàn)槟男┧^的牛人,也許也如你一般,并沒有行走在內(nèi)心所要的道路上,只是披了一件華麗的外衣,掩藏了內(nèi)心深處的傷痕。
            畢業(yè)之后會(huì)選擇擇業(yè)或是深造,很多都是無(wú)法離開現(xiàn)在既定的專業(yè)了,會(huì)想除了這,我還會(huì)些什么,是的,直到大學(xué)結(jié)束,我們有種思維正在根深蒂固,學(xué)到的知識(shí)能夠決定自己人生的方向。而這知識(shí)的選擇卻并非是自己所想要的,只是錯(cuò)誤的延續(xù)了下去。往往會(huì)忘記,獲取知識(shí)的這種能力,因?yàn)闆]有單位能夠給這種能力一個(gè)量化的指標(biāo),使得這種能力的擁有者也會(huì)在別人的反問中對(duì)自己產(chǎn)生越來越大的懷疑,這也是因?yàn)槲覀兒苌偾宄恼J(rèn)識(shí)到它的存在,在實(shí)踐中主動(dòng)的運(yùn)用它,只是在一種迷糊的狀態(tài)下行動(dòng)著,猶如霧里看花,除了朦朧還是朦朧,而后在錯(cuò)誤中錯(cuò)誤下去,到清醒之時(shí)已沒有勇氣去迎接真實(shí)的自己。把所有的固定的知識(shí)忘卻,剩下的就是屬于你的精華。知識(shí)是一種累積,一種沉淀,隨著慢慢的積累總會(huì)體現(xiàn)出它的重量,但是智慧是一種方法,一種思維,能夠使你懂得如何獲取知識(shí),如何運(yùn)用它們,如何創(chuàng)造出帶有自己鮮明特性的價(jià)值。
            一路之中還有很多東西在不斷的消失,還有勇氣,指出是非對(duì)錯(cuò)的勇氣,給出自己見解的勇氣,承認(rèn)錯(cuò)誤的勇氣,大聲喊出愛的勇氣。也許你會(huì)說,現(xiàn)在學(xué)得應(yīng)該是我喜歡的,你也是加了應(yīng)該兩個(gè)字,說明內(nèi)心之中有了動(dòng)搖,而不夠穩(wěn)定堅(jiān)固的地基之上是建造不出高樓大廈的。請(qǐng)先沉下心來深思,從過去,到現(xiàn)在,順便望一望未來,也許有種觸動(dòng)會(huì)從內(nèi)心深處蔓延開來。但是一旦確認(rèn)了你的喜好,請(qǐng)鼓起勇氣,大聲的喊出自己的心聲,堅(jiān)定不移的走下去。
            用一句也許不是很相關(guān)的話作為結(jié)語(yǔ):
            如果愛,請(qǐng)深愛!!

            posted @ 2012-06-18 23:22 鐘謝偉 閱讀(1674) | 評(píng)論 (4)編輯 收藏

            繼承類中改變基類內(nèi)public or protected屬性

               1: class Base
               2: {
               3: private:
               4:     int m_nValue;
               5:  
               6: public:
               7:     Base(int nValue)
               8:         : m_nValue(nValue)
               9:     {
              10:     }
              11:  
              12: protected:
              13:     void PrintValue() { cout << m_nValue; }
              14: };
              15:  
              16: class Derived: public Base
              17: {
              18: public:
              19:     Derived(int nValue)
              20:         : Base(nValue)
              21:     {
              22:     }
              23:  
              24:     // Base::PrintValue was inherited as protected, so the public has no access
              25:     // But we're changing it to public by declaring it in the public section
              26:     Base::PrintValue;
              27: };

            注意 Base::PrintValue; 該語(yǔ)句并沒有添加()

            posted @ 2012-06-12 10:12 鐘謝偉 閱讀(1457) | 評(píng)論 (3)編輯 收藏

            簡(jiǎn)單的Int容器類

                 摘要: from http://www.learncpp.com/cpp-tutorial/104-container-classes/ 1: #ifndef INTARRAY_H 2: #define INTARRAY_H 3: 4: #include <assert.h> // for assert() 5: 6: class IntArray 7:...  閱讀全文

            posted @ 2012-06-08 21:44 鐘謝偉 閱讀(1196) | 評(píng)論 (0)編輯 收藏

            時(shí)間管理

            介紹一個(gè)簡(jiǎn)單有效的時(shí)間管理方式,番茄工作法!!

            posted @ 2012-06-08 11:24 鐘謝偉 閱讀(114) | 評(píng)論 (0)編輯 收藏

            wxwidgets編程規(guī)范一二

            詳細(xì)內(nèi)容參見:http://www.wxwidgets.org/develop/standard.htm

            以一個(gè)入門的新手來看,C++具有很大的靈活性,與技巧性,但是這些技巧性的東西可能帶來的是代碼可讀性的降低,效率的不穩(wěn)定,以及很多人對(duì)于C++的唾罵。本人理解,C++的靈活性是用來構(gòu)建庫(kù)的,而在具體項(xiàng)目運(yùn)用中是在類庫(kù)的一定限制規(guī)范下選擇合適的庫(kù)進(jìn)行開發(fā),這樣開發(fā)效率和代碼的可讀性將大大提升。

            理解可能有誤,請(qǐng)拍板。

            在使用wxwidget庫(kù)編寫時(shí),

            通常的C++規(guī)則(部分)

            1. 不使用C++模版

            2. 不使用C++異常

            3. 不使用RTTI

            4. 不使用命名空間

            5. 不使用STL

            6. 在for內(nèi)部不進(jìn)行變量的聲明

            7. 不使用嵌套類

            8. 不使用新的邏輯關(guān)鍵字(or,and,not等)

            9. 不使用全局變量

            10. 將warnings打開,并消除warnings

            11. 使用#if 0注釋代碼段

            12. 避免重載虛函數(shù)

            13. 避免使用額外的分號(hào)

             

            wxWedget規(guī)則

            1. 同一文件頭部

            /////////////////////////////////////////////////////////////////////////////
            // Name:        src/common/foo.cpp
            // Purpose:     Implementation of wxFoo
            // Author:      Your Name
            // Created:     2006-12-03
            // RCS-ID:      $Id: standard.htm 1562 2012-01-08 11:38:14Z VZ $
            // Copyright:   (c) 2006 wxWidgets development team
            // Licence:     wxWindows licence
            /////////////////////////////////////////////////////////////////////////////

            2. 用四個(gè)空格代替tab

            3. public 然后 protected 然后 private

            4. 使用wx作為公共符號(hào)

            5. 文檔中避免使用!

            posted @ 2012-06-04 19:45 鐘謝偉 閱讀(1310) | 評(píng)論 (0)編輯 收藏

            8.8 構(gòu)造函數(shù)(2) [翻譯]

                 摘要: 原文 from www.learncpp.com/cpp-tutorial/88-constructors-part-ii/ 私有構(gòu)造函數(shù) 偶爾,我們不想讓用戶在class外使用特殊的構(gòu)造函數(shù)。為了實(shí)現(xiàn)這個(gè)想法,我們可以將構(gòu)造函數(shù)設(shè)定為私有的。 1: class Book 2: { 3: private: 4: int m_nPages; 5: 6: ...  閱讀全文

            posted @ 2012-05-30 22:06 鐘謝偉 閱讀(1196) | 評(píng)論 (0)編輯 收藏

            寫點(diǎn)什么,雜言

            從開始學(xué)習(xí)C++到現(xiàn)在已經(jīng)將近4年了,大一時(shí)上的課程就只講了和C語(yǔ)言處理相同的部分,最為關(guān)鍵的面向?qū)ο缶幊虆s被無(wú)視了,接下去的兩年半的時(shí)間也沒有怎么接觸過這門語(yǔ)言,直到大三下的時(shí)候才有種想續(xù)前緣的沖動(dòng),到現(xiàn)在斷斷續(xù)續(xù)的學(xué)習(xí),沒有什么項(xiàng)目,沒有什么任務(wù),進(jìn)度不是很大。
            也許作為新手的通病,經(jīng)常會(huì)在大堆的書海中徘徊,看了這本,沒看多久,有人說另一本更好,又拿起那本從頭繼續(xù)開始看,這樣下來,只是在不斷的重復(fù)著,卻沒有前進(jìn),或是前進(jìn)的步伐慢到一時(shí)半刻難以察覺的地步。
            現(xiàn)在通過寫博客來督促自己,堅(jiān)持下去,總會(huì)出現(xiàn)奇跡。
            教程先緊抓一本,將其熟悉了再考慮是否繼續(xù)換一本,當(dāng)然作為一門編程語(yǔ)言,實(shí)踐自然是必不可少的,看書之余,看看別人的代碼,構(gòu)思一下即將要做的小項(xiàng)目,拿幾個(gè)問題練練手,如此才能更好的進(jìn)步。

            posted @ 2012-05-29 22:18 鐘謝偉 閱讀(136) | 評(píng)論 (0)編輯 收藏

            錯(cuò)誤處理

            編程中一般出現(xiàn)的錯(cuò)誤有兩種:語(yǔ)法上的錯(cuò)誤與語(yǔ)義上的錯(cuò)誤,語(yǔ)法中的錯(cuò)誤幾乎都能夠被編譯器識(shí)別出來,但是語(yǔ)義上的錯(cuò)誤編譯器就無(wú)法識(shí)別,因此在編程的過程中應(yīng)該時(shí)刻警惕語(yǔ)義錯(cuò)誤的出現(xiàn)。

            在編程初始,我們可以事先編寫防錯(cuò)的程序段,一般錯(cuò)誤會(huì)出現(xiàn)在什么地方呢?

            1)函數(shù)調(diào)用時(shí)傳遞的參數(shù)的有效性

            2)函數(shù)的返回值可能隱含了錯(cuò)誤發(fā)生的可能

            3)從用戶或文件中讀取的輸入導(dǎo)致的錯(cuò)誤

            為了很好的避免這些錯(cuò)誤,我們通常遵循如下的措施:

            1)在函數(shù)的頂部,確保傳遞進(jìn)來的參數(shù)有效

            2)函數(shù)調(diào)用后,檢測(cè)返回值

            3)使輸入的值有效,符合規(guī)范

            那么選取怎樣的方式對(duì)錯(cuò)誤進(jìn)行處理呢,一般如下:

            1)快速跳過代碼

               1: void PrintString(char *strString)
               2: {
               3:     // Only print if strString is non-null
               4:     if (strString)
               5:         std::cout << strString;
               6: }

            2)想調(diào)用程序中,返回錯(cuò)誤碼

               1: int g_anArray[10]; // a global array of 10 characters
               2:  
               3: int GetArrayValue(int nIndex)
               4: {
               5:     // use if statement to detect violated assumption
               6:     if (nIndex < 0 || nIndex > 9)
               7:        return -1; // return error code to caller
               8:  
               9:     return g_anArray[nIndex];
              10: }

            3)如果你想在發(fā)現(xiàn)錯(cuò)誤時(shí)直接終止程序,可以使用exit函數(shù)

               1: int g_anArray[10]; // a global array of 10 characters
               2:  
               3: int GetArrayValue(int nIndex)
               4: {
               5:     // use if statement to detect violated assumption
               6:     if (nIndex < 0 || nIndex > 9)
               7:        exit(2); // terminate program and return error number 2 to OS
               8:  
               9:     return g_anArray[nIndex];
              10: }

            4)如果用戶輸入不合理的值,就繼續(xù)要求輸入

               1: char strHello[] = "Hello, world!";
               2:  
               3: int nIndex;
               4: do
               5: {
               6:     std::cout << "Enter an index: ";
               7:     std::cin >> nIndex;
               8: } while (nIndex < 0 || nIndex >= strlen(strHello));
               9:  
              10: std::cout << "Letter #" << nIndex << " is " << strHello[nIndex] << std::endl;

            5)可以使用cerr輸出錯(cuò)誤,在gui編程的時(shí)候,可以直接在遇到錯(cuò)誤的時(shí)候跳出對(duì)話框,輸出錯(cuò)誤碼,然后終止

               1: void PrintString(char *strString)
               2: {
               3:     // Only print if strString is non-null
               4:     if (strString)
               5:         std::cout << strString;
               6:     else
               7:         std::cerr << "PrintString received a null parameter";
               8: }

             

            另,可以使用assert

               1: int g_anArray[10]; // a global array of 10 characters
               2:  
               3: #include <cassert> // for assert()
               4: int GetArrayValue(int nIndex)
               5: {
               6:     // we're asserting that nIndex is between 0 and 9
               7:     assert(nIndex >= 0 && nIndex <= 9); // this is line 7 in Test.cpp
               8:  
               9:     return g_anArray[nIndex];
              10: }

            posted @ 2012-05-28 21:05 鐘謝偉 閱讀(193) | 評(píng)論 (0)編輯 收藏

            堆和棧【翻譯】

            看到一篇比較有意思的文章,在這里就翻譯一下,當(dāng)今天發(fā)表的內(nèi)容了。

            from http://www.learncpp.com/cpp-tutorial/79-the-stack-and-the-heap/

            一個(gè)程序?qū)τ趦?nèi)存的使用,一般可以分為四類:

            1. 代碼區(qū)域,通過的編譯的程序在代碼中存儲(chǔ)的位置

            2. 全局變量區(qū)域,全局變量存儲(chǔ)的位置

            3. 堆,動(dòng)態(tài)內(nèi)存分配的變量存儲(chǔ)的位置

            4. 棧,函數(shù)參數(shù)和局部變量存儲(chǔ)的位置

            下面將主要針對(duì)3,4兩個(gè)方面進(jìn)行論述。

             

            堆是一個(gè)用于動(dòng)態(tài)分配的很大的內(nèi)存池。在C++中,當(dāng)你使用new操作符分配內(nèi)存時(shí),這個(gè)內(nèi)存是從堆中取得的。

               1: int *pValue = new int; // pValue is assigned 4 bytes from the heap
               2: int *pArray = new int[10]; // pArray is assigned 40 bytes from the heap

            因?yàn)椋峙涞膬?nèi)存的準(zhǔn)確位置事先是不知道的,所以分配的內(nèi)存是間接獲取的,也就說明了為什么new操作符返回的是指針。這里你并不需要擔(dān)心背后內(nèi)存具體如何分配的機(jī)制。但是,有一點(diǎn)值得明了,連續(xù)的內(nèi)存請(qǐng)求所指向的很可能不是連續(xù)的地址的內(nèi)存片段。如:

               1: int *pValue1 = new int;
               2: int *pValue2 = new int;
               3: // pValue1 and pValue2 may not have sequential addresses

            上例中,兩個(gè)new是連續(xù)的,但是分配得到的pValue1和pValue2的地址是不連續(xù)的。當(dāng)動(dòng)態(tài)分配的變量被刪除后,內(nèi)存有被返回到堆中以備后續(xù)中再次被動(dòng)態(tài)分配。

            堆有如下優(yōu)缺點(diǎn):

            1. 分配的內(nèi)存一直處于被分配的狀態(tài),知道去分配操作出現(xiàn),才回到初始狀態(tài)(沒有及時(shí)去分配,如new后沒有用delete,會(huì)導(dǎo)致內(nèi)存的泄漏)。

            2. 動(dòng)態(tài)分配的內(nèi)存必須通過指針聯(lián)系

            3. 由于堆是一個(gè)很大的內(nèi)存池,大的數(shù)組,結(jié)構(gòu),類都應(yīng)該在這里分配得到內(nèi)存

             

            棧調(diào)用扮演了一個(gè)很有趣的角色。在我們討論棧調(diào)用之前,讓我們討論一下什么叫做棧。

            想象一下自助餐廳中的一堆疊起來的盤子。因?yàn)槊總€(gè)盤子都比較重,它們被疊起來的,你只能做以下三件事情。

            1)看向最上面的盤子

            2)將最上面的盤子拿掉

            3)在上面放一個(gè)新的盤子

            在計(jì)算機(jī)編程中,棧是一個(gè)存儲(chǔ)其他變量的容器(很像一個(gè)數(shù)組)。但是,一個(gè)數(shù)組能夠以你想要的方式任意更改獲取其中的元素,棧則有更多的限制,棧中能夠進(jìn)行的操作如下:

            1)查看棧頂?shù)捻?xiàng)

            2)將棧頂?shù)捻?xiàng)從頂部移除

            3)將一個(gè)新的項(xiàng)放置頂部

            棧是后進(jìn)先出(LIFO)的數(shù)據(jù)結(jié)構(gòu)。

            (略掉一些內(nèi)容······)

            我們主要來看當(dāng)調(diào)用函數(shù)是棧發(fā)生了一些什么行為。

            1)發(fā)生函數(shù)調(diào)用處的相關(guān)指令的地址被push進(jìn)棧中

            2)函數(shù)返回類型置于棧中,設(shè)置一個(gè)占位符

            3)CPU跳至函數(shù)的代碼中

            4)現(xiàn)在棧頂?shù)膬?nèi)容是一個(gè)特殊指針,棧幀。隨后所有的加入到棧中的內(nèi)容都是該函數(shù)的局部信息。

            5)所有的函數(shù)參數(shù)都被放入棧中

            6)函數(shù)中的指令得到執(zhí)行

            7)函數(shù)中的局部變量push棧中

            當(dāng)函數(shù)結(jié)束的時(shí)候,發(fā)生如下事件:

            1)函數(shù)的返回值拷貝進(jìn)入一個(gè)占位符中,

            2)在棧幀之后的所有內(nèi)容都被pop off,所有的局部變量都被銷毀

            3)返回值被pop off并賦值給函數(shù)中的變量,如果調(diào)用函數(shù)的返回值沒有賦值給任何東西,該值就會(huì)丟失

            4)下一個(gè)語(yǔ)句的地址從棧中pop off,CPU繼續(xù)執(zhí)行

             

            棧溢出

            棧的大小是有限的,只能有序的容納一定量的信息。如果程序試圖向棧中放入過多的信息,棧將會(huì)溢出。棧溢出發(fā)生在棧的內(nèi)存都被分配完了,那種情況下,更多的分配,將會(huì)發(fā)生在內(nèi)存的其它片段中。

            棧溢出通常發(fā)生在分配了太多的變量到棧上,或太多的嵌套函數(shù)調(diào)用,導(dǎo)致結(jié)果就是程序的奔潰。

            如:

               1: int main()
               2: {
               3:     int nStack[100000000];
               4:     return 0;
               5: }

            棧的優(yōu)缺點(diǎn):

            * 棧中的內(nèi)容可以一直保留到pop off發(fā)生

            * 編譯時(shí),棧中分配的內(nèi)存是已知的,因此,可以直接通過變量訪問內(nèi)存。

            * 因?yàn)闂O鄬?duì)而言是比較小的,所以小心會(huì)吃掉很多棧空間的事情。包括大型數(shù)組,結(jié)構(gòu)體,類過多的內(nèi)嵌,過多的遞歸等。

            posted @ 2012-05-27 23:08 鐘謝偉 閱讀(1855) | 評(píng)論 (3)編輯 收藏

            僅列出標(biāo)題
            共4頁(yè): 1 2 3 4 
            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(1)

            隨筆檔案

            IT網(wǎng)站

            My Friends

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            精品久久久久久久久免费影院| 色综合久久最新中文字幕| 久久综合亚洲鲁鲁五月天| 久久综合亚洲色HEZYO社区 | 99久久99这里只有免费费精品| 国产情侣久久久久aⅴ免费| 久久国产精品99精品国产987| 久久精品无码一区二区三区日韩| 欧美亚洲国产精品久久久久| 久久精品国产亚洲av麻豆色欲| 久久国产精品-国产精品| 欧美伊人久久大香线蕉综合69| 伊人久久大香线焦AV综合影院| 久久免费小视频| 欧美日韩精品久久久久| 九九久久99综合一区二区| 亚洲精品美女久久久久99小说| av无码久久久久久不卡网站| 久久无码精品一区二区三区| 人妻少妇久久中文字幕| 久久久久一本毛久久久| 久久久久亚洲AV成人片| 色综合久久天天综线观看| 99久久中文字幕| 精品无码久久久久国产动漫3d| 国产成人久久精品二区三区| 奇米影视7777久久精品| 久久亚洲中文字幕精品一区| 国产精品一区二区久久| 99精品久久精品一区二区| 久久精品18| 亚洲综合婷婷久久| 99久久久国产精品免费无卡顿 | 久久久国产精品亚洲一区| 久久影视综合亚洲| 午夜不卡888久久| 国产精品免费福利久久| 性做久久久久久久| 四虎国产精品成人免费久久| 久久人人爽人爽人人爽av| 久久se精品一区二区|