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

            hdqqq

              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              35 隨筆 :: 0 文章 :: 104 評論 :: 0 Trackbacks
            共2頁: 1 2 
            @Chipset
            麻煩看清楚文章再噴
            12 行沒檢查返回值
            53 行 new 一定成功嗎
            在alloc和free中看到了new和delete,這種分配不會是o(1)的。
            re: 被delete難倒了[未登錄] hdqqq 2011-04-01 11:32
            如果樓主使用 /mt 編譯,dll啟動時(shí)使用自己的堆, 在主程序中new 出來的對象,再通過指針傳給dll,然后在dll中釋放,會產(chǎn)生錯(cuò)誤,主程序和dll使用不同的堆。
            * 查找光標(biāo)當(dāng)前單詞
            gd 查找光標(biāo)單詞定義
            ga 顯示光標(biāo)下字母ascii碼
            比較討厭這種引用計(jì)數(shù)指針的使用,一旦使用就意味這在所有的函數(shù)參數(shù)中必須使用指針引用或者值拷貝,一旦某些函數(shù)要求用裸指針,就可能引發(fā)問題。
            文件映射無助于增加進(jìn)程可用地址空間。除非你修改set的實(shí)現(xiàn),把對節(jié)點(diǎn)的訪問直接
            對應(yīng)到對文件的訪問,但是在大數(shù)據(jù)量的情況下,隨機(jī)訪問的效率很差。

            關(guān)鍵還是在于減少內(nèi)存的使用上

            1. stl 中的set使用紅黑樹實(shí)現(xiàn)的,一個(gè)節(jié)點(diǎn)有左,右,父節(jié)點(diǎn)三個(gè)指針和一個(gè)紅黑標(biāo)志位.32位系統(tǒng)下最少占用13個(gè)字節(jié),
            考慮內(nèi)存對齊下,可能使用到16個(gè)字節(jié),在大數(shù)據(jù)量的情況下,為了保持這個(gè)樹結(jié)構(gòu),額外使用的內(nèi)存是很多的,可以考慮使用hash set.

            2. url長度都比較長,可考慮計(jì)算md5 hash,減少存儲占用.

            3. 不要妄想把所有數(shù)據(jù)都存在內(nèi)存,總會有內(nèi)存耗盡的時(shí)候,另外,如果程序異常或者崩潰,所有數(shù)據(jù)將丟失.

            我以前實(shí)現(xiàn)的一種方式是,以數(shù)據(jù)庫為主要存儲,內(nèi)存作為優(yōu)先查詢cache.
            1. 數(shù)據(jù)庫建散列表, 以十六進(jìn)制 0-F 開始,根據(jù)md5第一位決定存儲表,用于存儲md5值,并對md5建索引加快查詢.
            2. 在內(nèi)存中用set或map保存md5值,查詢時(shí)先計(jì)算url md5值,再查詢內(nèi)存,如果不存在,則從數(shù)據(jù)庫加載.如為新url,先存入內(nèi)存.
            3. 內(nèi)存總量到一定閥值,進(jìn)行數(shù)據(jù)保存,并清空內(nèi)存cache.

            不過這種實(shí)現(xiàn)存在cache命中問題,你可以一次加載整張表,也可以用 like 查詢條件,減少數(shù)據(jù)庫返回的記錄數(shù).

            已有的php實(shí)現(xiàn),內(nèi)存cache200萬條記錄,總內(nèi)存使用在1200M左右,可長時(shí)間運(yùn)行,沒有內(nèi)存使用問題.
            麒麟感覺就是參照freebsd搞的,看top的顯示就知道了,可以說是一抹一樣.
            可能就是直接拿過來調(diào)了一下。
            配置文件中增加
            imap <F3> <Esc>gg=G
            或者
            nmap <F3> gg=G
            以后一鍵搞定.
            @hdqqq
            上面已經(jīng)貼了類似的,我的作廢。
            unsigned long val ;
            int count = 0;
            while(val) {
            count += (val & 1) ;
            val >>= 1;
            }
            用協(xié)議棧代碼和ace代碼對比欠妥,基礎(chǔ)層要提供的接口和要實(shí)現(xiàn)的功能相對固定,而在應(yīng)用層上,要復(fù)雜很多。
            照著樓主的代碼,果然有問題,麻煩樓主以后寫代碼或者轉(zhuǎn)文章對讀者負(fù)責(zé)一下,最煩這種轉(zhuǎn)文章的,搞的搜索結(jié)果都一樣,都是轉(zhuǎn)帖的。
            re: 邪惡的Windows[未登錄] hdqqq 2009-07-31 17:25
            你有命名MessageBox的權(quán)利,條件是別去包含 <windows.h>
            既然你包含了這個(gè)文件,那就乖乖換名字吧。
            涉及的東西太多了,有些還不完善,線程庫在windows下只是簡單的封裝,連優(yōu)先級調(diào)整都沒有,線程局部存貯沒有編譯開關(guān)。
            這個(gè)和include .h 文件有啥區(qū)別,后綴不同而已。
            是啊,所以我讓你看
            typeid(std::string()).name()
            的輸出.
            typedef void (type_func)(void);
            typedef void (*ptype_func)(void);

            template <typename T>
            class template_class
            {
            private:
            typedef T local_type;
            public:
            template_class()
            {
            std::cout << typeid(local_type).name() << std::endl;
            }
            };

            void test()
            {
            template_class<int> la;
            template_class<type_func> lg;
            template_class<ptype_func> lb;
            template_class<int()> le;
            template_class<int(int)> lf;
            template_class<int(int())> lc;
            template_class<void()> ld;
            }

            上面的代碼可編譯通過
            std::string() 也可以看作是一個(gè)類型.

            long test(void);
            sizeof(test) 和 sizeof( test() )
            前面一個(gè)是 函數(shù)指針, 后面一個(gè)是 test 的返回值 long.

            你可以看看這個(gè)的輸出.
            std::cout << typeid(std::string).name() << std::endl;
            std::cout << typeid(std::string()).name() << std::endl;

            在下面這句話里
            boost::function<std::string()> func(Test);

            這個(gè)std::string 的變量根本不會被構(gòu)造, 所以不存在 所謂的實(shí)例.
            re: C 還是 CPP[未登錄] hdqqq 2009-04-10 18:41
            @Lingol
            可能我舉得例子太簡單了,在編譯時(shí)候沒開優(yōu)化的情況下,是不會精簡代碼的.在復(fù)雜的情況下,如果 funcb被這個(gè)類的某個(gè)虛函數(shù)依賴.
            如:

            class CTestClass
            {
            public:
            CTestClass(void);
            ~CTestClass(void);
            public:
            void mem_func1();
            void mem_func2();
            virtual void vfunc();
            };


            int test_function(int);

            static int glob_val;

            CTestClass::CTestClass(void)
            {
            glob_val = 10;
            }

            CTestClass::~CTestClass(void)
            {
            glob_val = 0;
            }

            void CTestClass::mem_func1()
            {
            glob_val = 1;
            }

            void CTestClass::mem_func2()
            {
            printf("hello world\n");
            }

            void CTestClass::vfunc()
            {
            mem_func1();
            }


            int test_function(int val)
            {
            int ret = val;

            CTestClass lt;
            lt.mem_func2();
            return ret;
            }
            用vs2003把
            上面的代碼被編譯成了lib,在main函數(shù)中調(diào)用
            test_function(atoi(argv[1]));開啟全部優(yōu)化,在生成的map文件中顯示

            _main 00401000 f comple_test.obj
            ??0CTestClass@@QAE@XZ 00401020 f complie_lib:TestClass.obj
            ??1CTestClass@@QAE@XZ 00401040 f complie_lib:TestClass.obj
            ?mem_func1@CTestClass@@QAEXXZ 00401060 f complie_lib:TestClass.obj
            ?mem_func2@CTestClass@@QAEXXZ 00401070 f complie_lib:TestClass.obj
            ?vfunc@CTestClass@@UAEXXZ 00401080 f complie_lib:TestClass.obj
            ?test_function@@YAHH@Z 00401090 f complie_lib:TestClass.obj

            可以看到,盡管只調(diào)用了構(gòu)造,析構(gòu)和mem_func2,mem_func1 還是連接在里面.

            re: C 還是 CPP[未登錄] hdqqq 2009-04-07 23:12
            我說的這個(gè)程序,它的用途是和一些數(shù)據(jù)打包后,需要在客戶機(jī)器上直接運(yùn)行,不需要安裝或依賴額外的dll,就像直接運(yùn)行的電子書或者demo啥的,如果試想程序有上兆,數(shù)據(jù)才幾百k是不是有點(diǎn)浪費(fèi),而且以后還可能制作成千上百個(gè)的文件,累計(jì)起來是很可觀的,執(zhí)行文件大小和效率一樣重要. 另外 crt用dll的話,vc6的crt dll基本上windows系統(tǒng)都有,但是vc2005的crt就不是每個(gè)系統(tǒng)都有的,你需要另外裝個(gè)vc2005 redistributable. 至于庫的問題,程序的配置文件,一開始用的是一個(gè)跨平臺的xml解析lib, 開始的時(shí)候運(yùn)行的很好,但是當(dāng)配置文件在600K以上的時(shí)候,效率慘不忍睹,后來算了,改為直接結(jié)構(gòu)化讀寫,一樣解決問題,我寫這篇文章的目的,不是說啥庫都不用,而是不要濫用,模版也一樣,在做程序規(guī)劃的時(shí)候,在寫程序的時(shí)候,多用用 "奧卡姆剃刀".
            re: C 還是 CPP[未登錄] hdqqq 2009-04-05 19:27
            效率還是很重要的,打個(gè)比方,客戶要輛自行車,一個(gè)手工作坊弄了輛捷安特出來,一個(gè)號稱全能的車間弄了輛28吋永久出來,你說那個(gè)更好,我寫這篇文章的目的,是想說在寫代碼的時(shí)候,用到某項(xiàng)功能或者庫的時(shí)候,你需要清楚地了解,你會付出哪些代價(jià),并且權(quán)衡一下,如果沒有使用的必要,就不要用.對于一個(gè)新開發(fā)的項(xiàng)目來說,沒有對比,也許還不是很突出,但是對于已有項(xiàng)目來說,是一個(gè)很重要的問題.
            多謝反饋意見.
            這個(gè)錯(cuò)誤是
            ts.WriteLine(external.menuArguments.document.selection.createRange().text);
            這句代碼有問題,缺省打開的是ascii文件, 改成uncode模式打開文件就好了.
            修改后的代碼

            <script language="javascript">
            var fso,ForAppending,ts;
            var t_str;
            fso=new ActiveXObject("Scripting.FileSystemObject");
            ForAppending = 8;
            ts = fso.OpenTextFile("c:\\collect.txt",ForAppending, true, -1); //在這里是一個(gè)絕對路經(jīng),用的時(shí)候必須修改
            t_str = external.menuArguments.document.selection.createRange().text;
            ts.WriteLine(t_str);
            ts.WriteLine("#########################");
            ts.close();
            </script>
            任務(wù)只是抽象意義上的需要運(yùn)行的代碼,函數(shù)和成員函數(shù)只是對于人來說的,對于機(jī)器來說,都是一樣的,至于已有函數(shù)滿不滿足接口我想是架構(gòu)需要考慮的問題,其實(shí)一旦代碼編譯好了,其調(diào)用方式就定了,如果非要滿足所有的調(diào)用方式,可能rpc或者com的方式更適合一些。
            我以前寫的關(guān)于 函數(shù)和線程方面調(diào)用的文章。

            http://blog.csdn.net/hdqqq/archive/2005/06/29/407674.aspx
            其實(shí)不一定要過度追求線程實(shí)現(xiàn),一般的實(shí)現(xiàn)方式是啟動幾個(gè)線程提供對外服務(wù),有任務(wù)提交后,分配運(yùn)行。這樣可伸縮性也比較強(qiáng)。
            re: boost 1-35編譯[未登錄] hdqqq 2008-07-16 17:13
            你到linux下編譯一下就知道了,不帶版本號的是一個(gè)鏈接,但是在windows下不支持,所以有兩個(gè)了,用鏈接的好處就是可以隨時(shí)升級新的版本.
            c++編譯的時(shí)候,對函數(shù)名進(jìn)行修飾,用于實(shí)現(xiàn)函數(shù)充載,而c里面沒有這個(gè),所以需要用extern “C” 在對頭文件進(jìn)行聲明的時(shí)候加以區(qū)分。這個(gè)用于鏈接的時(shí)候進(jìn)行函數(shù)名查找。
            re: 可愛的Vim[未登錄] hdqqq 2008-05-26 10:56
            vim 是控制臺程序,所以可以遠(yuǎn)程登錄后進(jìn)行文件編輯,這點(diǎn)上windows下的編輯器根本沒這個(gè)功能.

            vim用熟了,鼠標(biāo)根本用不著,很靈活.
            @苦惱
            我寫的爬蟲,主要的幾個(gè)類都在代碼里面了,你用java開發(fā)的話,關(guān)鍵還是找到對應(yīng)的功能,象map或者h(yuǎn)ash map, http下載, 正則表達(dá)式等功能的類或者庫,還有就是處理數(shù)據(jù)庫的模塊,應(yīng)該可以實(shí)現(xiàn)的.
            是的,那些在javascript中的url比較難用正則表達(dá)式概括出來,因?yàn)檫€可能是根據(jù)變量生成的,所以就直接過濾了.

            至于排重的問題,因?yàn)槲矣?jì)算的是url的md5,而不是整個(gè)html的md5,所以在碰到頁面更新而url不變的時(shí)候,會有問題.這個(gè)我在測試新浪新聞首頁的時(shí)候,發(fā)現(xiàn)盡管新浪新聞首頁的url不變,內(nèi)容會變,但是具體到其中的某條新聞,都是有單獨(dú)的url的.碰到這種情況,只要周期的運(yùn)行一下爬蟲就可以了,我現(xiàn)在的機(jī)器上就是用crontab 定時(shí)運(yùn)行的.

            這個(gè)也和爬蟲的目的有關(guān)系,有的可能更關(guān)注某個(gè)具體站點(diǎn),有的也許想多爬一些站點(diǎn),這個(gè)是深度和廣度的關(guān)系,和使用者的策略有關(guān).

            我現(xiàn)在用的是一張表記錄歷史記錄,在百萬數(shù)量記錄下,效率不是最好的,建立更小的的分布存儲表可能會更好一些. 這些可以部署架構(gòu)方面進(jìn)行改進(jìn).
            郵件已經(jīng)發(fā)了.
            @TD
            是的,如果開始的時(shí)候指定vector是可以的,但是限定了vector的大小。
            不用vector是考慮到在大數(shù)據(jù)量的情況下,vector會進(jìn)行內(nèi)存的拷貝復(fù)制,所以采用了list
            re: OOP的黃昏[未登錄] hdqqq 2007-12-07 18:31
            標(biāo)題取的和內(nèi)容沒啥聯(lián)系。看了標(biāo)題跑進(jìn)來,原來在將concept。
            extern "C" 之后,就不能重載函數(shù)了,關(guān)鍵還是函數(shù)名修飾的問題.
            如果隱藏私有的數(shù)據(jù)成員,會不會造成實(shí)現(xiàn)代碼中sizeof(class) 和使用該類時(shí)sizeof(class) 大小不同, 導(dǎo)致數(shù)據(jù)出錯(cuò).
            裝個(gè)beryl 弄個(gè)立體桌面,比vista 酷多了.
            loki for vc6 我已經(jīng)上傳了,下載地址.
            http://www.shnenglu.com/Files/hdqqq/lokiVC6port.zip
            我這里有,留個(gè)mail地址我發(fā)給你.
            跨平臺的數(shù)據(jù)庫操作接口,比較難實(shí)現(xiàn).
            類似于Format的用法可以象下面這樣,只是少了格式字符串
            make_str("當(dāng)前計(jì)數(shù):",100,"總計(jì)數(shù)", 150);
            至于效率的問題,確實(shí)是沒有sprintf這種直接操作的函數(shù)快,因?yàn)樯婕暗椒祷氐目截悘?fù)制的開銷和stringstream的內(nèi)部實(shí)現(xiàn)等制約.
            這些函數(shù)的目的只是為了生成字符串,至于是顯示出來還是寫入文件,是看需求的,功能就象cstring 的format 成員函數(shù).
            這個(gè)倒是沒考慮過.
            你可以取看看boost中的preprocessor 部分,講的是預(yù)處理元編程,你這個(gè)宏的功能和boost 中的BOOST_PP_ENUM_PARAMS 宏功能類似.
            共2頁: 1 2 
            99久久精品国产一区二区蜜芽| 国产精品久久久久久久久鸭| 亚洲午夜福利精品久久| 2021国内久久精品| 久久国产精品无码一区二区三区| 美女写真久久影院| 中文字幕人妻色偷偷久久| 亚洲乱亚洲乱淫久久| 久久久噜噜噜久久中文字幕色伊伊| 久久超乳爆乳中文字幕| 欧美久久综合九色综合| 熟妇人妻久久中文字幕| 欧美午夜A∨大片久久 | 婷婷久久综合| 九九99精品久久久久久| 亚洲中文久久精品无码ww16| 国产成人久久777777| 久久夜色精品国产噜噜噜亚洲AV| 精品久久久久国产免费| 狠狠色丁香婷综合久久| 无码人妻精品一区二区三区久久久| 久久久91精品国产一区二区三区 | 2020久久精品亚洲热综合一本| 99久久精品费精品国产一区二区| 亚洲欧美久久久久9999 | 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 99久久久久| 国产精品18久久久久久vr| 东方aⅴ免费观看久久av| 亚洲国产精品嫩草影院久久| 国内精品久久久久久久coent| 国产成人精品白浆久久69| 色综合久久无码中文字幕| 亚洲色欲久久久综合网东京热| 日本精品久久久久久久久免费| segui久久国产精品| 99久久伊人精品综合观看| 99国内精品久久久久久久| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 狠狠色丁香久久婷婷综合五月| 久久综合给久久狠狠97色|