→ johnhmj:但…問題是,new/delete是很常用的關鍵字呀! (._.?) 06/26 21:30
你當然可以用 new,但沒事不要 new 一個陣列到處丟。我相信大部分的狀況都不用
自己花那麼多心力管理記憶體...。另外就是大家都在用的東西不見得是好東西啊 xDDD
→ loveme00835:用新版的allocator吧, 我覺得多數人不用malloc/free 06/26 21:51
→ loveme00835:的原因是不用sizeof算引數值, 但是隱含呼叫建構子的語 06/26 21:53
→ loveme00835:意這點都被忽略, 所以整份碼就算記憶體管理得好, 也是 06/26 21:54
→ loveme00835:讀起來有夠噁心 06/26 21:55
確實 allocator 不會呼叫建構子(你說的新版是指 C++0x 嗎?),但為什麼要讓
記憶體維持在一個沒有初始化的狀態呢?回到主題,反對自己沒事 new 一個 array 的
理由,同樣的也適用於 allocator...
→ angleevil:看了一下primer發現,allocator好像malloc喔.我還是愛new 06/26 22:13
概念上沒錯,雖然他們有些小小的細節差異 xD 另外 new 也不保證會幫你作初始化,
在某些狀況下(如原 Po 的 int 陣列)要加上 initializer. 我相信 C++ Primer 有講,
就不贅言了...
※ 編輯: Favonia 來自: 140.112.30.39 (06/26 22:45)
→ loveme00835:我指的新版是scoped_allocator,其連記憶體來源都可以 06/26 23:14
→ loveme00835:遞迴指定, 不去呼叫建構子不代表它沒有初始化過, 因為 06/26 23:16
→ loveme00835:多個物件可以活在重疊的空間裡, new要玩就玩多個版本 06/26 23:17
→ loveme00835:不是只用一種的半調子, 它的用途根本不在這 06/26 23:18
(版主要求合併,避免整個版都被我的文章淹沒 xD)
補充一些資訊給不知道 scoped_allocator 的人好了。考慮這樣的狀況:
vector<string>
以往 C++03 只能(方便的)要求 vector 要用某個 allocator, 但每個
string 卻可能使用預設 allocator. C++0x 目前企圖引入一些新的方法,讓
你也可以控制裡面 string 的 allocator, 甚至更多層。可以參考這個 PDF:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2554.pdf
(尤其第三四五頁的圖很可愛又很清楚。)
===
我想你的意思是說使用 allocator 可以看清楚「要記憶體」和「初始
化」這兩步。但我個人的立場是,這樣的區分只會帶給程式設計師額外的精
神負擔,所以我問為什麼要區分開來。我猜測你的意思是說區分開來就可以
實作記憶體共用或其他精彩的技巧。雖然技術上可以硬幹,但我個人反對用
allocator 來實作記憶體分享(也就是 flyweight pattern),因為實作記
憶體分享可以用高階、獨立於 allocator 的方法實作,不需要碰底層。
就精神上來說,allocator 代表一個低階的記憶體管理介面,然後
scoped_allocator(精神上)還是一個低階的記憶體管理介面。這介面(精
神上)並沒有考慮共用。技術上來說,為了要共用,你得要判斷兩個物件
是不是可以用一個物件代替,可是 allocator 的介面只能傳大小。根本沒
辦法從大小判斷是不是同一個物件,所以得要自己另外定介面硬幹。我個人
認為,在一般的狀況下使用「高階的記憶體分享寫法」配合預設的 allocator
就足夠用了,並不需要把整套丟到 allocator 裡自己實作。總之不好意思
我還是沒有被說服分開兩階段有什麼好處。
澄清一下,當需要嚴格控制記憶體時,當然要用 allocator. 我的意思
是說「平常」沒事不要也不用管低階的事情,因為很容易出錯又沒有太大好
處。
===
// 以下部份複製自原文。誤解版主意思很抱歉。
不精確的說,new 的意義,就是建立一個物件,而一個物件,就是記憶體
上一塊區域,如此而已。(C++ 的語意很難精確定義... orz)new 當然有很
多版本,例如某個版本會在記憶體不夠時傳回空指標,某個版本可以直接拿現
有的指標來玩等等。包括 new[], C++03 至少有六種。不過不管是哪一種,重
點是沒事不要自己 new 一個陣列。我想這句話跟到底用哪個版本一點關係也沒
有,而 allocator 也避不開同樣的問題。
// 以下是原文的推文
→ loveme00835:我對你的看法很有意見, 我是針對你不同問題回, 你好像 06/27 07:56
→ loveme00835:以為我把他們搞在一起, 我推薦allocator的原因是其具 06/27 07:57
→ loveme00835:函式帶來的細緻操作可讓每個步驟變得更清楚. 還有既然 06/27 07:59
→ loveme00835:你說物件就只是記憶體而已, 那為什麼還特別強調用高階 06/27 08:01
→ loveme00835:方法取代低階操作? 06/27 08:04
→ loveme00835:要說精神, 去 comp.lang.c++/comp.std.c++ 看比較準喔 06/27 08:17
(為了反應推文所以 allocator 重寫。以下簡短回應原推文。)
物件是一塊記憶體,但不是佔記憶體都是物件。標準用一整大段來講物件
是什麼東西(我不要再貼標準了 orz 詳情請看 C++03 1.8 [intro] )。總之
new 的意義大致上是建立物件。
至於強調高階方法的原因我重寫時已經加上去了。見上文。
關於精神層面,我都盡量引用標準委員會公佈的語言標準和討論的文件。
當然那兩個群組應該不錯,不過我相信我引用的文件也不會輸。
→ firejox:我還是去擁抱malloc好了...另外假如要一份乾淨的mem可以 06/27 00:20
→ firejox:用calloc... 06/27 00:20
對於 C 或許可以,對於 C++ 有點危險。(我是假設這篇主題是 C++ 啦!)
至少有以下問題:
(1) 都是 0 不一定是物件良好的初始狀態。
(2) 要 malloc/free 配合用。個人覺得 new/new[] 分兩種已經夠麻煩了。
不過你所要應付的狀況真的非常在乎速度和空間嗎?預設的 allocator
如果夠用就不用自己把手弄髒。把工作丟給那些函式庫吧。
→ angleevil:~"~如果版主指c++0x的allocator,恩,我可能要一段時間 06/27 08:44
→ angleevil:才會研究,我現在主打c. 06/27 08:45
→ angleevil:~"~c++真是怪物,好多都沒碰過. 06/27 08:47
※ 編輯: Favonia 來自: 140.112.30.39 (06/27 13:40)
→ firejox:這種跟弄髒手無關,而是對於寫的code的掌握度.. 06/27 20:22
→ firejox:malloc/free 他只是簡單易用而已... 06/27 20:23
→ firejox:任何物件都有他的初始化 這是寫code要設定的部份 06/27 20:31
喔喔,了解 @@
※ 編輯: Favonia 來自: 140.112.30.39 (06/28 06:48)