2009-11-26 58 views
1

由Mr.Spolsky閱讀文章"Back to Basics"後,我曾經想過串結構C,會聚大部分帕斯卡爾式的字符串的優勢(長度字節)和經典ASCIIZ- C中的字符串並減少了它們的大部分缺點。主要需求是使這個新字符串在機器命令中有效。 (這個任務我想,每一個字符是單字節對不起:))還有一個字符串實現:優點和缺點

我的想法是存儲字符串(也可以包含零個字節)在這樣的結構的字節數組:

  • - 字符串長度呈現的字節長度(值爲1或更大);
  • 1..presLength + 1 - 字符串長度表示(1或更多字節;可能有固定長度(即處理更簡單,但確定字符串長度限制);
  • presLength + 2..arrrayLength - 字符串內容。

我希望這種方法可以解決斯波斯基先生注意到的大多數問題,但是假設有一些缺陷。我想知道你的意見。你怎麼看待這件事?

+4

Joel實際上沒有寫字符串,你知道。他僅僅將它們用作插圖,因爲任何程序員都會知道它們。但他的主要觀點是你應該避免O(N * N)算法。 – MSalters 2009-11-26 09:27:51

+4

對於你的表示沒有理解一件事,甚至沒有你想要解決的問題。你想解決使strcat()不是O(n * n)算法的問題?有很多方法可以做到這一點。 如果你打算編寫一個真正的程序,我建議使用框架提供的現有字符串結構,如Qt,Gtkmm,WxWindows,MFC,std :: lib。他們都可以解決strcat問題,還有更多,如unicode轉換和其他棘手的功能。 – 2009-11-26 09:34:36

+0

你想解決製造strcat()而不是O(n * n)算法的問題 是的,這是其中一項任務。 如果你打算寫一個真正的程序, 如果我寫一個真正的程序,我肯定不會重新創建一個自動程序。這個任務只是一個純粹的思維遊戲。我認爲C和Pascal中字符串實現的比較是不同方法的一個很好的例子,它具有不同的優點和缺點。有些缺點是由優點產生的。 – 2009-11-26 10:36:22

回答

4

從C++的經驗,我們知道,一個更有效的字符串類型的短字符串優化。通過將字符串庫存儲爲16或32字節的對象來實現這一點。這取代了傳統上在C中使用的4或8字節char*。在字符串庫中,您將存儲大小。如果大小很小,則使用結構的其餘部分來存儲實際的字符串內容。這避免了小字符串的堆分配,並改善了引用的局部性。對於大字符串,你可以在堆上分配內存,並將該指針存儲在字符串長度之後。

其中的一個原因,這是有效的,因爲高速緩存線通常16個字節,並從和向主存儲器作爲一個單元複製。因此,如果你讀取一個4字節的字符串長度,那麼後面的12個字節便宜。

3

你的可變長度長度表示將是一起工作,特別是在以有效的方式的夢魘。

由於C中沒有單個對象可能太大而無法將其大小表示爲size_t,因此長度字段永遠不會大於sizeof(size_t)。除非你有很多非常短的字符串(比如,幾個字符),否則果汁看起來不太可能是值得的 - 你可以在字符串的開始處有一個固定長度的長度值size_t

+0

...最後,如果字符串集由短字符串占主導地位,那麼migth會達到100%的內存開銷。 – AnT 2009-11-26 10:17:19

+0

如果您有保留數億4個字符串在內存中的應用程序...你可能會發現有利可圖,它們存儲在另一種方式:) – caf 2009-11-26 11:47:35

+0

@AndreyT:如果你存儲大量的字符串在單個陣列,並且想要最小化每個字符串的開銷,那麼每個字符串都不應該以任何格式存儲它自己的大小。按長度對它們進行排序,並保留一個單獨的可搜索索引,以便查找字符串指針的長度。提問的方案要求每個非空字符串,這已經是接近100%的開銷,如果串組由(很)短串爲主至少2個字節。我會質疑每個字符串2個字節與每個字符串4個字節之間的差異的頻率,但您無法改進其他方式。 – 2009-11-26 12:01:50

6

到目前爲止,太複雜了。甚至非常簡單的操作 - 追加單個字符的字符串的末尾 - 需要以下步驟(假設可變字符串):

  1. 讀字節0到確定長度呈現
  2. 讀字節1的長度..P,計算長度
  3. 寫入字符在字符串的結尾
  4. 長度增加,檢查溢出
  5. 如果溢出:增加0字節,將整串,以騰出空間長度較長的演示
  6. 發表長度

這是不合理的。只需要一個類似pascal的字符串,但使用一個字(32位整數)而不是長度字節,並且使整個字符串字對齊更容易和快得多。對於最大尺寸的4GB限制對於任何確實是字符串的事情都不起作用。

+0

已經完成。見BSTR。 – 2009-11-26 09:47:45

+0

亞歷克斯:當然,這是太明顯不能在2009年底 – 2009-11-26 09:55:42

+0

被髮明首先,與32位長度的主要問題不是4GB的限制,但隨着短字符串潛力巨大的內存開銷。其次,那是什麼工作太多了?重要的是,櫃檯面積的增加將是一個相對罕見的事件,「工作」將不是圖書館的實施。 – AnT 2009-11-26 10:15:59

1

作爲一個練習,我認爲你應該走在前面。對於實際使用,已經有足夠的經過充分測試的字符串實現,您應該真正使用其中的一種。

This可能會讓你知道那裏已經有了什麼。雖然名單似乎不完整。

0

在你完全摒棄這條道路之前,你應該看看其他的嘗試來解決這個問題。你會學到什麼工作(也許沒有工作),並獲得自己的解決方案的想法。或者可能更好,找到一個已經制定的解決方案。

有不少圖書館試圖改善C的字符串處理。以下是一些讓你開始:

有一個vstr項目頁面,其中包含一些非常全面的(並與其他一些字符串庫進行比較):http://www.and.org/vstr/comparison