全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1761
推到 Plurk!
推到 Facebook!

請問用STL 和用 TList?

尚未結案
seaphone
一般會員


發表:5
回覆:9
積分:2
註冊:2004-07-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-27 12:10:59 IP:140.112.xxx.xxx 未訂閱
請問用STL 和 TList 的記憶體配置有何不一樣? 如STL裡的vector 和 bcb 的TList 在配置記憶體方面那個比較穩 ..? 謝謝... 因為最近小弟在用TList 後發現如果指標只得太頻繁.. 有時候會讓list 裡面的data 自行改變 如:裡面本來存的TPoint 是( 5, 666) 會變成(3439322, 234235252) 超怪!! 而且有時候還不會發生.... P.S:不過我有仔細檢查自己的程式所指的位子都是對的...
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-27 17:42:35 IP:211.76.xxx.xxx 未訂閱
seaphone你好:     vector的記憶體配置是連續的實體空間。TList則是array of pointers,pointer才指向實體。另外還要提一點,TList的個數是有上限的:    MaxListSize = Maxint div 16;        如果單就記憶體的配置方式來看,vector比較不容易出錯。不過我想TList也是很穩定的,只是要小心指標的使用。另外如果有multiple thread的話,也要改用thread safe的List。     至於選用那一個…如果你存的資料是單純性的固定大小結構,用vector是比較適合的。但如果有用多型或是vcl的class,那TList是很方便的。以你的狀況,建議用vector。(TPoint只是單純的結構)速度和效能都比較好。參考一下
seaphone
一般會員


發表:5
回覆:9
積分:2
註冊:2004-07-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-28 20:11:52 IP:61.219.xxx.xxx 未訂閱
引言: seaphone你好: vector的記憶體配置是連續的實體空間。TList則是array of pointers,pointer才指向實體。另外還要提一點,TList的個數是有上限的: MaxListSize = Maxint div 16; 如果單就記憶體的配置方式來看,vector比較不容易出錯。不過我想TList也是很穩定的,只是要小心指標的使用。另外如果有multiple thread的話,也要改用thread safe的List。 至於選用那一個…如果你存的資料是單純性的固定大小結構,用vector是比較適合的。但如果有用多型或是vcl的class,那TList是很方便的。以你的狀況,建議用vector。(TPoint只是單純的結構)速度和效能都比較好。參考一下 < face="Verdana, Arial, Helvetica"> 那也就是說如果存的是物件的話, 用TList 比較穩囉...? 其實因為我自己有寫一個class 然後也是用TList 來存 然後這個class 裡面又有TList member 去存TPoint 所以這樣相互包來包去.. 不知道是不是因為這樣才會當機, 或是常會跑到不穩, 不過我是有試過用兩種方法宣告動態記憶體 new 和malloc 我是聽說用new 會比較好, 可是我試了一試還是一樣 不過好像比malloc 穩一點
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-09-28 21:26:57 IP:211.76.xxx.xxx 未訂閱
其實我的原意是…兩個都很穩定。 大部分的問題其實都是我們使用者的bug,不然就是使用上的錯誤。 選擇上只是在效能與使用方便上做考慮。    另外如果程式跑起來不穩定的話, 最好還是重新考慮使用的資料結構。 可以不用指標做到的功能,就不要用到他。 如果有用到指標,最好也都用smart pointer包裝,減少自已出錯的可能。 以上僅是參考..
seaphone
一般會員


發表:5
回覆:9
積分:2
註冊:2004-07-22

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-09-30 10:14:11 IP:140.112.xxx.xxx 未訂閱
引言: 其實我的原意是…兩個都很穩定。 大部分的問題其實都是我們使用者的bug,不然就是使用上的錯誤。 選擇上只是在效能與使用方便上做考慮。 另外如果程式跑起來不穩定的話, 最好還是重新考慮使用的資料結構。 可以不用指標做到的功能,就不要用到他。 如果有用到指標,最好也都用smart pointer包裝,減少自已出錯的可能。 以上僅是參考.. < face="Verdana, Arial, Helvetica"> 請問一下那用smart pointer包裝是什麼意思呢....? 是跟用STL有關嘛...? 其實我是有查到前面文章有關 smart pointer 有看到版主回別人文章的時候也有用到這個名詞 但是還是不知道為何意...? 謝謝
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-09-30 13:45:06 IP:211.76.xxx.xxx 未訂閱
seaphone你好:     smart pointer的內容不少,相關的議題也很多。我只能提一些方向讓你看看。     現在存在於Cplusplus標準裡的,只有一種smart pointer。宣告在memory裡面。名稱是auto_ptr。此外在下一版的標準,預訂會加入share_ptr。     auto_ptr與share_ptr功能不同,要注意的地方也不少。使用上特別要注意不要把auto_ptr和STL的容器合用,會出問題。share_ptr現在還不是標準C裡有的,不過已經存在boost的library裡面。(找一下boost的網站,就可以下載)實作上share_ptr用的方法是運用了reference count(如果我沒記錯的話)。相當安全而且好用,與STL合用也可以正常運作。建議如果不知道選那種smart pointer來用的時候,就用share_ptr。        smart_ptr的用法如下,以auto_ptr為例:
 
#include 
using namespace std;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
auto_ptr FileList(new TStringList);
FileList->LoadFromFile("filelist.txt");
FileList->Sort();
Memo1->Assign(FileList.get());
}
FileList在函式結束時會自動delete。而且更有趣的是,如果函式中有丟出exception,FileList還是可以正常的delete。但如果你用pointer來做的話,還要寫個try.catch才能安全的delete pointer的內容。因此運用smart pointer可以方便解決exception丟出時常有的memory leakage問題。省去一堆try..catch。 以上只是個簡單的例子,相關的進階用法,就需要你自已去挖囉。
seaphone
一般會員


發表:5
回覆:9
積分:2
註冊:2004-07-22

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-09-30 20:34:31 IP:140.112.xxx.xxx 未訂閱
引言: seaphone你好: smart pointer的內容不少,相關的議題也很多。我只能提一些方向讓你看看。 現在存在於Cplusplus標準裡的,只有一種smart pointer。宣告在memory裡面。名稱是auto_ptr。此外在下一版的標準,預訂會加入share_ptr。 auto_ptr與share_ptr功能不同,要注意的地方也不少。使用上特別要注意不要把auto_ptr和STL的容器合用,會出問題。share_ptr現在還不是標準C裡有的,不過已經存在boost的library裡面。(找一下boost的網站,就可以下載)實作上share_ptr用的方法是運用了reference count(如果我沒記錯的話)。相當安全而且好用,與STL合用也可以正常運作。建議如果不知道選那種smart pointer來用的時候,就用share_ptr。 smart_ptr的用法如下,以auto_ptr為例:
 
#include 
using namespace std;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
auto_ptr FileList(new TStringList);
FileList->LoadFromFile("filelist.txt");
FileList->Sort();
Memo1->Assign(FileList.get());
}
FileList在函式結束時會自動delete。而且更有趣的是,如果函式中有丟出exception,FileList還是可以正常的delete。但如果你用pointer來做的話,還要寫個try.catch才能安全的delete pointer的內容。因此運用smart pointer可以方便解決exception丟出時常有的memory leakage問題。省去一堆try..catch。 以上只是個簡單的例子,相關的進階用法,就需要你自已去挖囉。 < face="Verdana, Arial, Helvetica"> 謝謝pwipwi大大: 學了不少東西, 不過您FileList.get() 應該改成 FileList->get() 不過我是覺得因為我現在寫的程式用到的這些存object 等資料的list 都是希望裡面的資料會保留到其他的函式,不希望這裡面跑完了就自動把 資料刪去, 所以我想說可能要審慎的注意容量的大小, 以及pointer 的使用 謝謝!!
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-09-30 22:13:17 IP:211.76.xxx.xxx 未訂閱
FileList.get()是沒錯的,我會特別加到例子中就是要說明"smart pointer"其實並不是真的pointer,他是一個class。get()是class的function member。
系統時間:2024-06-29 15:45:16
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!