re: 有問題的c++通信代碼的識別[未登錄] hdqqq 2016-04-12 11:36
12 行沒檢查返回值
53 行 new 一定成功嗎
在alloc和free中看到了new和delete,這種分配不會是o(1)的。
re: 被delete難倒了[未登錄] hdqqq 2011-04-01 11:32
如果樓主使用 /mt 編譯,dll啟動時使用自己的堆, 在主程序中new 出來的對象,再通過指針傳給dll,然后在dll中釋放,會產生錯誤,主程序和dll使用不同的堆。
re: 自己常用的 VIM 命令[未登錄] hdqqq 2011-03-27 23:12
* 查找光標當前單詞
gd 查找光標單詞定義
ga 顯示光標下字母ascii碼
比較討厭這種引用計數指針的使用,一旦使用就意味這在所有的函數參數中必須使用指針引用或者值拷貝,一旦某些函數要求用裸指針,就可能引發問題。
文件映射無助于增加進程可用地址空間。除非你修改set的實現,把對節點的訪問直接
對應到對文件的訪問,但是在大數據量的情況下,隨機訪問的效率很差。
關鍵還是在于減少內存的使用上
1. stl 中的set使用紅黑樹實現的,一個節點有左,右,父節點三個指針和一個紅黑標志位.32位系統下最少占用13個字節,
考慮內存對齊下,可能使用到16個字節,在大數據量的情況下,為了保持這個樹結構,額外使用的內存是很多的,可以考慮使用hash set.
2. url長度都比較長,可考慮計算md5 hash,減少存儲占用.
3. 不要妄想把所有數據都存在內存,總會有內存耗盡的時候,另外,如果程序異常或者崩潰,所有數據將丟失.
我以前實現的一種方式是,以數據庫為主要存儲,內存作為優先查詢cache.
1. 數據庫建散列表, 以十六進制 0-F 開始,根據md5第一位決定存儲表,用于存儲md5值,并對md5建索引加快查詢.
2. 在內存中用set或map保存md5值,查詢時先計算url md5值,再查詢內存,如果不存在,則從數據庫加載.如為新url,先存入內存.
3. 內存總量到一定閥值,進行數據保存,并清空內存cache.
不過這種實現存在cache命中問題,你可以一次加載整張表,也可以用 like 查詢條件,減少數據庫返回的記錄數.
已有的php實現,內存cache200萬條記錄,總內存使用在1200M左右,可長時間運行,沒有內存使用問題.
麒麟感覺就是參照freebsd搞的,看top的顯示就知道了,可以說是一抹一樣.
可能就是直接拿過來調了一下。
re: Vim操作技巧札記(一)[未登錄] hdqqq 2010-11-09 16:20
配置文件中增加
imap <F3> <Esc>gg=G
或者
nmap <F3> gg=G
以后一鍵搞定.
unsigned long val ;
int count = 0;
while(val) {
count += (val & 1) ;
val >>= 1;
}
re: 學之者生,用之者死——ACE歷史與簡評 hdqqq 2010-03-12 16:37
用協議棧代碼和ace代碼對比欠妥,基礎層要提供的接口和要實現的功能相對固定,而在應用層上,要復雜很多。
照著樓主的代碼,果然有問題,麻煩樓主以后寫代碼或者轉文章對讀者負責一下,最煩這種轉文章的,搞的搜索結果都一樣,都是轉帖的。
re: 邪惡的Windows[未登錄] hdqqq 2009-07-31 17:25
你有命名MessageBox的權利,條件是別去包含 <windows.h>
既然你包含了這個文件,那就乖乖換名字吧。
涉及的東西太多了,有些還不完善,線程庫在windows下只是簡單的封裝,連優先級調整都沒有,線程局部存貯沒有編譯開關。
這個和include .h 文件有啥區別,后綴不同而已。
re: 類實例能做做模板參數嗎?[未登錄] hdqqq 2009-06-03 21:08
是啊,所以我讓你看
typeid(std::string()).name()
的輸出.
re: 類實例能做做模板參數嗎?[未登錄] hdqqq 2009-06-02 13:38
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;
}
上面的代碼可編譯通過
re: C 還是 CPP[未登錄] hdqqq 2009-05-27 14:34
re: 類實例能做做模板參數嗎?[未登錄] hdqqq 2009-05-27 10:14
std::string() 也可以看作是一個類型.
long test(void);
sizeof(test) 和 sizeof( test() )
前面一個是 函數指針, 后面一個是 test 的返回值 long.
你可以看看這個的輸出.
std::cout << typeid(std::string).name() << std::endl;
std::cout << typeid(std::string()).name() << std::endl;
在下面這句話里
boost::function<std::string()> func(Test);
這個std::string 的變量根本不會被構造, 所以不存在 所謂的實例.
re: C 還是 CPP[未登錄] hdqqq 2009-04-10 18:41
@Lingol
可能我舉得例子太簡單了,在編譯時候沒開優化的情況下,是不會精簡代碼的.在復雜的情況下,如果 funcb被這個類的某個虛函數依賴.
如:
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函數中調用
test_function(atoi(argv[1]));開啟全部優化,在生成的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
可以看到,盡管只調用了構造,析構和mem_func2,mem_func1 還是連接在里面.
re: C 還是 CPP[未登錄] hdqqq 2009-04-07 23:12
我說的這個程序,它的用途是和一些數據打包后,需要在客戶機器上直接運行,不需要安裝或依賴額外的dll,就像直接運行的電子書或者demo啥的,如果試想程序有上兆,數據才幾百k是不是有點浪費,而且以后還可能制作成千上百個的文件,累計起來是很可觀的,執行文件大小和效率一樣重要. 另外 crt用dll的話,vc6的crt dll基本上windows系統都有,但是vc2005的crt就不是每個系統都有的,你需要另外裝個vc2005 redistributable. 至于庫的問題,程序的配置文件,一開始用的是一個跨平臺的xml解析lib, 開始的時候運行的很好,但是當配置文件在600K以上的時候,效率慘不忍睹,后來算了,改為直接結構化讀寫,一樣解決問題,我寫這篇文章的目的,不是說啥庫都不用,而是不要濫用,模版也一樣,在做程序規劃的時候,在寫程序的時候,多用用 "奧卡姆剃刀".
re: C 還是 CPP[未登錄] hdqqq 2009-04-05 19:27
效率還是很重要的,打個比方,客戶要輛自行車,一個手工作坊弄了輛捷安特出來,一個號稱全能的車間弄了輛28吋永久出來,你說那個更好,我寫這篇文章的目的,是想說在寫代碼的時候,用到某項功能或者庫的時候,你需要清楚地了解,你會付出哪些代價,并且權衡一下,如果沒有使用的必要,就不要用.對于一個新開發的項目來說,沒有對比,也許還不是很突出,但是對于已有項目來說,是一個很重要的問題.
re: 在IE中增加文字內容收集功能[未登錄] hdqqq 2009-01-23 15:52
多謝反饋意見.
這個錯誤是
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); //在這里是一個絕對路經,用的時候必須修改
t_str = external.menuArguments.document.selection.createRange().text;
ts.WriteLine(t_str);
ts.WriteLine("#########################");
ts.close();
</script>
re: 線程模型:將任務與執行分離[未登錄] hdqqq 2008-08-26 16:12
任務只是抽象意義上的需要運行的代碼,函數和成員函數只是對于人來說的,對于機器來說,都是一樣的,至于已有函數滿不滿足接口我想是架構需要考慮的問題,其實一旦代碼編譯好了,其調用方式就定了,如果非要滿足所有的調用方式,可能rpc或者com的方式更適合一些。
我以前寫的關于 函數和線程方面調用的文章。
http://blog.csdn.net/hdqqq/archive/2005/06/29/407674.aspx
re: 線程模型:將任務與執行分離[未登錄] hdqqq 2008-08-26 15:04
其實不一定要過度追求線程實現,一般的實現方式是啟動幾個線程提供對外服務,有任務提交后,分配運行。這樣可伸縮性也比較強。
re: boost 1-35編譯[未登錄] hdqqq 2008-07-16 17:13
你到linux下編譯一下就知道了,不帶版本號的是一個鏈接,但是在windows下不支持,所以有兩個了,用鏈接的好處就是可以隨時升級新的版本.
re: HTML 轉 text 工具 hdqqq 2008-07-15 07:46
c++編譯的時候,對函數名進行修飾,用于實現函數充載,而c里面沒有這個,所以需要用extern “C” 在對頭文件進行聲明的時候加以區分。這個用于鏈接的時候進行函數名查找。
re: 可愛的Vim[未登錄] hdqqq 2008-05-26 10:56
vim 是控制臺程序,所以可以遠程登錄后進行文件編輯,這點上windows下的編輯器根本沒這個功能.
vim用熟了,鼠標根本用不著,很靈活.
re: 一個輕量級家用爬蟲[未登錄] hdqqq 2008-05-19 14:50
@苦惱
我寫的爬蟲,主要的幾個類都在代碼里面了,你用java開發的話,關鍵還是找到對應的功能,象map或者hash map, http下載, 正則表達式等功能的類或者庫,還有就是處理數據庫的模塊,應該可以實現的.
re: 一個輕量級家用爬蟲[未登錄] hdqqq 2008-05-14 11:36
是的,那些在javascript中的url比較難用正則表達式概括出來,因為還可能是根據變量生成的,所以就直接過濾了.
至于排重的問題,因為我計算的是url的md5,而不是整個html的md5,所以在碰到頁面更新而url不變的時候,會有問題.這個我在測試新浪新聞首頁的時候,發現盡管新浪新聞首頁的url不變,內容會變,但是具體到其中的某條新聞,都是有單獨的url的.碰到這種情況,只要周期的運行一下爬蟲就可以了,我現在的機器上就是用crontab 定時運行的.
這個也和爬蟲的目的有關系,有的可能更關注某個具體站點,有的也許想多爬一些站點,這個是深度和廣度的關系,和使用者的策略有關.
我現在用的是一張表記錄歷史記錄,在百萬數量記錄下,效率不是最好的,建立更小的的分布存儲表可能會更好一些. 這些可以部署架構方面進行改進.
re: HTML 轉 text 工具[未登錄] hdqqq 2008-05-13 14:14
郵件已經發了.
@TD
是的,如果開始的時候指定vector是可以的,但是限定了vector的大小。
不用vector是考慮到在大數據量的情況下,vector會進行內存的拷貝復制,所以采用了list
re: OOP的黃昏[未登錄] hdqqq 2007-12-07 18:31
標題取的和內容沒啥聯系。看了標題跑進來,原來在將concept。
re: C中如何調用C++函數[未登錄] hdqqq 2007-11-30 18:14
extern "C" 之后,就不能重載函數了,關鍵還是函數名修飾的問題.
如果隱藏私有的數據成員,會不會造成實現代碼中sizeof(class) 和使用該類時sizeof(class) 大小不同, 導致數據出錯.
裝個beryl 弄個立體桌面,比vista 酷多了.
re: 一個讀取xml配置文件的通用模板 hdqqq 2007-09-12 09:07
re: 顯示字符串的函數[未登錄] hdqqq 2007-08-03 09:39
類似于Format的用法可以象下面這樣,只是少了格式字符串
make_str("當前計數:",100,"總計數", 150);
至于效率的問題,確實是沒有sprintf這種直接操作的函數快,因為涉及到返回的拷貝復制的開銷和stringstream的內部實現等制約.
re: 顯示字符串的函數[未登錄] hdqqq 2007-07-31 13:11
這些函數的目的只是為了生成字符串,至于是顯示出來還是寫入文件,是看需求的,功能就象cstring 的format 成員函數.
re: 數組取大小[未登錄] hdqqq 2007-06-15 11:42
這個倒是沒考慮過.
你可以取看看boost中的preprocessor 部分,講的是預處理元編程,你這個宏的功能和boost 中的BOOST_PP_ENUM_PARAMS 宏功能類似.