[問題] sizeof大小變動的class

看板C_and_CPP作者 (安福虎之助)時間13年前 (2012/07/04 06:18), 編輯推噓8(8042)
留言50則, 10人參與, 最新討論串1/2 (看更多)
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) g++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) none 問題(Question): 最近在測試sizeof發現了一個問題,假設宣告class為 class data{ public: int score; char *name; }; initiate兩個data物件; data d1; d1.score=100; d1.name="aaa"; data d2; d2.score=0; d2.name="x"; 然後用sizeof求大小 sizeof(d1); sizeof(d2); 餵入的資料(Input): 預期的正確結果(Expected Output): 求出來的結果是一樣都是8,但是希望可以求出該物件真正Byte的大小 ex. d1:4+4=8; d2:4+2=6; 請問各位大大除了 sizeof(d1.score)+strlen(d1.name)+1還有什麼方法呢? 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 169.234.137.89

07/04 14:25, , 1F
你的"真正的大小"到底是什麼?
07/04 14:25, 1F

07/04 14:26, , 2F
還有你為什麼需要找出這個大小?
07/04 14:26, 2F

07/04 14:27, , 3F
byte大小
07/04 14:27, 3F

07/04 14:28, , 4F
要做memcpy
07/04 14:28, 4F
※ 編輯: oneill 來自: 169.234.137.89 (07/04 14:51)

07/04 14:47, , 5F
你有注意到你的結構裡這整數和這字串並不是放在一起的嗎?
07/04 14:47, 5F

07/04 14:48, , 6F
這代表你一定得要兩個成員分別複製 不能一口氣 memcpy 過去
07/04 14:48, 6F

07/04 14:53, , 7F
有什麼情況在C++是一定要用到sizeof(class)呢?
07/04 14:53, 7F

07/04 14:53, , 8F
我覺得你比較需要的是copy constructor
07/04 14:53, 8F

07/04 14:57, , 9F
因為要做的是非常底層的資料庫實作,所以才需要計算每個資料
07/04 14:57, 9F

07/04 14:58, , 10F
的大小,這樣的話才不會有的資料被切掉
07/04 14:58, 10F

07/04 14:59, , 11F
你知道資料庫的字串實作應該都是要做char xxx[1000]這樣
07/04 14:59, 11F

07/04 14:59, , 12F
嗎...
07/04 14:59, 12F

07/04 15:00, , 13F
p 大請多說一點.. 我覺得資料庫弄成 char [1000] 很浪費耶
07/04 15:00, 13F

07/04 15:02, , 14F
我實作選擇的方式是做成 min(def, len),智能成長 1.25 倍
07/04 15:02, 14F

07/04 15:02, , 15F
好奇這部份通常怎做的說..
07/04 15:02, 15F

07/04 15:02, , 16F
這是固定大小的實作,希望可以做到字串大小是可變的,所以才
07/04 15:02, 16F

07/04 15:02, , 17F
有這個疑問
07/04 15:02, 17F

07/04 15:02, , 18F
< min(def,len) 改成 max(def,len) 才對 >
07/04 15:02, 18F

07/04 15:04, , 19F
因為我在用資料庫的時候像是varchar都要給大小 然後
07/04 15:04, 19F

07/04 15:05, , 20F
像是text/bigtext..都有固定的字數上限不是QQ?
07/04 15:05, 20F

07/04 15:05, , 21F
因為當初學database課程要求實作的時候是這樣給spec的
07/04 15:05, 21F

07/04 15:05, , 22F
我覺得你需要的應該是strlen才對...
07/04 15:05, 22F

07/04 15:05, , 23F
是如此沒錯,excel/access field limit 都是 256.
07/04 15:05, 23F

07/04 15:05, , 24F
所以我一直這樣以為XD 如果不是的話還請告訴我 :D
07/04 15:05, 24F

07/04 15:05, , 25F
被斷推文! XD
07/04 15:05, 25F

07/04 15:08, , 26F
或許該問個前題 : 讀入txt後,有可能被改變嗎 ?
07/04 15:08, 26F

07/04 15:15, , 27F
突然想到…sizeof(d1.score)+strlen(d1.name)+1結果正確?
07/04 15:15, 27F

07/04 15:17, , 28F
樓上 可能他沒有要考慮padding @@?
07/04 15:17, 28F

07/04 15:19, , 29F
的確是沒有考慮padding
07/04 15:19, 29F

07/04 15:19, , 30F
哦哦突然發現他有用strlen了XD
07/04 15:19, 30F

07/04 16:31, , 31F
我有個問題, 你的char*指到的字串到底放在哪? 你要自己
07/04 16:31, 31F

07/04 16:31, , 32F
做string pool嗎?
07/04 16:31, 32F

07/04 16:33, , 33F
大概就位址aaa...是什麼不知道?xd
07/04 16:33, 33F

07/04 16:37, , 34F
所以搞不好還是要char array, 不用固定[1000]沒關係但
07/04 16:37, 34F

07/04 16:37, , 35F
可能要像tro^H^H^HEdi大大講得一樣要會智能成長XD 然後
07/04 16:37, 35F

07/04 16:38, , 36F
還要額外紀錄capacity (因為strlen不是capacity)
07/04 16:38, 36F

07/04 17:08, , 37F
char name[1];\
07/04 17:08, 37F

07/04 17:09, , 38F
這樣就可以用 sizeof(d1.score)+strlen(d1.name); 免+1
07/04 17:09, 38F

07/04 17:13, , 39F
不過每之在new之前需先算出name的長度並加入 class 的大小
07/04 17:13, 39F

07/04 17:16, , 40F
sizeof(d1)+strlen(name); 免+1
07/04 17:16, 40F

07/04 17:18, , 41F
在存入之前先存入緩衝區,並計算長度及分配空間,再存入d1.nam
07/04 17:18, 41F

07/04 17:18, , 42F
e
07/04 17:18, 42F

07/04 17:20, , 43F
可overload =號把以上步驟實作
07/04 17:20, 43F

07/04 17:25, , 44F
疑!樓上說的是 flex array 吧 , 都忘了有這個..
07/04 17:25, 44F

07/04 17:42, , 45F
忘了說,flexible array 本質上也是 shallow copy,非 deep.
07/04 17:42, 45F

07/04 18:36, , 46F
google: __attribute__((packed))
07/04 18:36, 46F

07/05 10:14, , 47F
很簡單,class 中只放了一個int、一個 (32bit) pointer
07/05 10:14, 47F

07/05 10:14, , 48F
所以 4 + 4 = 8. 而且這數字通常也不會有 alignment 問題
07/05 10:14, 48F

07/06 13:25, , 49F
請考慮 padding... 然後我家電腦的指標就是 64bit 了.....
07/06 13:25, 49F

07/06 13:27, , 50F
然後 C 和 C++ 混用自己多保重 xDDD
07/06 13:27, 50F
文章代碼(AID): #1Fy-1IFL (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1Fy-1IFL (C_and_CPP)