看板 Programming 關於我們 聯絡資訊
※ 引述《sorryChen (陳揚和)》之銘言: : 感謝大家耐心回覆我的問題 : 我必須要用static variable的原因是為了要節省空間 : 其實我原來比擬的"car"是一段encode binary string (DNA short fragment) : 只占 8 byte. 在加個int 每個read就多占4 btye了 : 因為原來每個fragment 長度都相等. 只需一份 'statict variable' : 現在需要多種不同長度的fragments set, 所以定義多個class 其他method相同 : 但是不同set 長度不同.. 所以要幾個class 有幾份自己的 "static variable" : 我確實應該作個abstract class 然後每個在定義自己的static variables : 比如說fragment30, fragment40, fragment50 .. fragment60.. : 30, 40, 50, 60是不同的 但這樣其實還滿困擾的 每個都要定一個用const 忘了在哪兒, 我曾經說過類似的話: 空間使用多少, 從來都不該當成是某 variable 要當成 instance variable 或 class variable 的依據, 而是 概念上, 它是不是真的是每個 instance 的 attribute. 當然, 可以像另外有人推文說用 template. 但假設我們以 OOP 的方法去解決, 如果你介意的是那 4byte, 那我覺得你不該以 OOP 來寫這堆程式了. 就算如你之前說 想靠 override 之類的方法去達成, 一般 method override 都是靠 virtual func ptr table, 你要加這一個 virtual method, 就等如在 virtual func ptr table 加了一個 entry, 那麼至少 就佔一個 ptr 的 size 了 (32 bit platform 就是 4 bytes 了) 以為在 variable 本身省了, 但在另一方面又多用了... anyway, 要是真的不想用 member variable 達成, 就唯有這樣吧: class Animal { protected virtual String getVoice() = 0; public void shout() { print("SHOUTS: " + getVoice()); } } class Cat extends Animal { static const String VOICE = "Meow"; protected virtual String getVoice() { return VOICE; } } 不過, 各類 OOPL 通常的 overhead 都比你介意的那 4 bytes 要大, 這樣省得到的有多少你可以自己留意了 :) 我一向覺得, 先寫得正 確, 真的有問題才想要不要做額外的 optimize 或 refactoring 吧 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 202.155.236.82
march20:其實我比較好奇的是, 原 po 為什麼想要 128.54.40.203 07/31 01:48
march20:節省那 4byte 啊? 是機器有限制嗎? 128.54.40.203 07/31 01:49
sorryChen:對啊 因為有上百萬個fragment所以長度要 128.125.87.33 07/31 06:32
sorryChen:用static variable來共用 128.125.87.33 07/31 06:33
adrianshum:百萬個, 每個 4byte 也才那幾 MB 而已 202.155.236.82 07/31 15:44
adrianshum:相比你至少幾十byte 的資料, 那真的很 202.155.236.82 07/31 15:45
adrianshum:小吧... 不然就用 short 甚至 char 存 202.155.236.82 07/31 15:45
adrianshum:長度吧... 1-2 bytes 不會負擔不來吧? 202.155.236.82 07/31 15:46
march20:原 po 用的機器倒底是什麼啊? 8086 嗎 XD 66.75.255.220 07/31 16:08
sorryChen:其實雖然reads很多但不會存不下來 128.125.87.33 08/01 11:23
sorryChen:雖然1B個reads也差不大.. 128.125.87.33 08/01 11:25