[ ⑨ ] PADDING
相信各位對PAD這個詞都不陌生,但是,你真的了解PAD的意義嗎?
在電腦資料處理上,PAD是一個十分重要的行為。
實際敘述上,則會以英文動名詞的詞性來表示,也就是PADDING。
PADDING並非永遠是必要的手段,但在需要時絕對少不了他。
簡單說,PADDING是一種利用少許空間,來換取美觀與實用的行為。
假設我們有如下的數筆資料:
73
┌────┐
咲夜1
咲夜2
咲夜3
咲夜4
所有咲夜的長度都是相等的,73cm......嗯抱歉,應該說是位元組。
73公....位元組在某些情況下,是一個既不美觀,又不實用的數字。
當然,這並非永遠如此,在某些場合中73仍然是很實用的。
會讓資料不實用的原因之一,與電腦讀取資料的方式有關。
當上述資料並排在一起存放時,各筆資料的開始與結束位置如下:
0 73 146 219
↓ ↓ ↓ ↓
咲夜1 咲夜2 咲夜3 咲夜4
然而,電腦在讀取資料時有一個性質:
「一次讀取的資料量,以及讀取的開頭位置,必須為特定單位的倍數。」
由於電腦是使用二進位法,所以這個單位就是二的某次方,例如16。
所以,當電腦在讀取咲夜1這筆資料時,從0到64的部分是比較沒有問題的。
但是從64到73這一部分卻無法簡單地一個動作讀取完成。
當然,電腦還是做的到這件事情。
只要讀取64到80的部分,也就是咲夜1的結尾和咲夜2的開頭,
再把不需要的部分忽略掉,就可以獲得所需要的資料。
但是這種較複雜的動作,也會花費比較多的時間。
因此,追求程式計算速度的人會盡量避免這種情形。
如果需要直接讀取任一筆資料,情況會變得更複雜。
例如,現在需要咲夜2這一份資料,也就是73到146這一段。
因為73不是16的倍數,所以電腦必須從64開始讀取。
又因為64到146這一部分的長度是82,也不是16的倍數,
所以電腦必須從64一口氣讀取到160,再去頭去尾才能取得所需要的資料。
PADDING的目的之一,就是為了解決這種麻煩。
我們只要將所有咲夜都加上長度為7的PAD,讓她們的長度都變成80:
73 7
┌────┬─┐
咲夜1 PAD
咲夜2 PAD
咲夜3 PAD
咲夜4 PAD
這樣並排在一起的咲夜就會變成下面這樣:
0 80 160 240
↓ ↓ ↓ ↓
咲夜1 PAD 咲夜2 PAD 咲夜3 PAD 咲夜4 PAD
如此一來,不管是讀取任何一筆資料,開始和結束都會是16的倍數。
用想像的也很容易理解:80這個數字,不管怎麼說都比73好看多了。
這就是PADDING的精髓:犧牲一點空間,換取相對划算的美觀與實用性。
值得一提的是,PADDING是一種依個人需求自行安排的行為。
所以PAD的大小並不是一個固定值,而是依不同需求而決定的。
在上面的例子中,假設電腦讀取資料時有16這個單位長度的限制。
但是對於不同的資料讀取指令來說,這個長度也可能是其他的數值。
但無論如何,他們一定是2的某次方。
如果今天的單位長度限制是32,那上面的PAD就不夠用了。
但是沒關係,只要改變PAD的大小就可以了:
73 23
┌────┬──┐
咲夜1 PAD
咲夜2 PAD
咲夜3 PAD
咲夜4 PAD
這樣一來,咲夜的長度變成了96。32的限制就輕鬆解決了。
而且96這個數字豈止是實用而已,光是想像就讓人興奮啊。
當然,PAD對於原資料而言是多餘的部分。
過大的PAD會讓資料存放多出額外的需求空間。
在這個時候,PADDING的效益是否能夠彌補空間上的犧牲,
就是一個要好好考慮,甚至進行實驗來做決定的問題了。
除了電腦讀取資料的限制之外,還有另外一個PADDING的理由:
「這筆資料必須被拿來執行某個動作,
但是,該動作要求資料的長度一定要是某個數值。」
如果今天有一個人跟你說,73、80、96這種長度都不夠看,一定要128這種數字才行。
可想而知,這應該是某種狂熱巨乳中毒症狀。
(Frantic F-cup Toxication,簡稱FFT)
為了滿足這種特殊需求,PAD的大小就會相當驚人:
73 55
┌────┬───┐
咲夜1 PAD
咲夜2 PAD
咲夜3 PAD
咲夜4 PAD
這種狀況通常都是無法選擇的。
資料讀取限制只是會讓你多花一點時間,但特殊動作的限制多半都是毫無彈性。
你要不就是犧牲大量空間,要不就是放棄FFT這種動作。
因此,PADDING絕對不只是一個笑點而已。
它是一個非常重要,甚至可以說是神聖的行為。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 1.161.195.101
推
05/23 21:58, , 1F
05/23 21:58, 1F
推
05/23 21:59, , 2F
05/23 21:59, 2F
推
05/23 22:01, , 3F
05/23 22:01, 3F
推
05/23 22:12, , 4F
05/23 22:12, 4F
推
05/23 22:13, , 5F
05/23 22:13, 5F
→
05/23 22:16, , 6F
05/23 22:16, 6F
※ 編輯: kirimaru73 來自: 1.161.195.101 (05/23 22:17)
推
05/23 22:33, , 7F
05/23 22:33, 7F
→
05/23 22:35, , 8F
05/23 22:35, 8F
推
05/23 22:35, , 9F
05/23 22:35, 9F
推
05/23 22:36, , 10F
05/23 22:36, 10F
推
05/23 22:50, , 11F
05/23 22:50, 11F
推
05/23 23:20, , 12F
05/23 23:20, 12F
→
05/23 23:21, , 13F
05/23 23:21, 13F
推
05/24 00:01, , 14F
05/24 00:01, 14F
推
05/24 00:53, , 15F
05/24 00:53, 15F
推
05/24 01:16, , 16F
05/24 01:16, 16F
推
05/24 02:15, , 17F
05/24 02:15, 17F
推
05/24 03:23, , 18F
05/24 03:23, 18F
推
05/24 07:42, , 19F
05/24 07:42, 19F
推
05/24 07:51, , 20F
05/24 07:51, 20F
推
05/24 07:51, , 21F
05/24 07:51, 21F
推
05/24 08:03, , 22F
05/24 08:03, 22F
推
05/24 10:07, , 23F
05/24 10:07, 23F
※ 編輯: kirimaru73 來自: 123.50.53.228 (05/24 11:42)
推
05/24 11:48, , 24F
05/24 11:48, 24F
推
05/24 14:37, , 25F
05/24 14:37, 25F
推
05/24 17:43, , 26F
05/24 17:43, 26F
推
05/24 19:12, , 27F
05/24 19:12, 27F
推
05/24 23:01, , 28F
05/24 23:01, 28F
推
05/25 03:10, , 29F
05/25 03:10, 29F
推
05/25 17:03, , 30F
05/25 17:03, 30F
推
05/27 11:12, , 31F
05/27 11:12, 31F
推
05/27 12:27, , 32F
05/27 12:27, 32F
推
06/01 17:47, , 33F
06/01 17:47, 33F
推
09/03 11:23, , 34F
09/03 11:23, 34F