看板 C_and_CPP 關於我們 聯絡資訊
首先 char* buffer = new char[1024]; // a big buffer int* pInt = reinterpret_cast<int*>(buffer); double* pDouble = reinterpret_cast<double*>(buffer); *pInt = 10; *pDouble = 20.0; 這樣做是沒問題的,而且得到標準 (C++ 2003 3.7.3.1p2) 的保證: The allocation function attempts to allocate the requested amount of storage...The pointer returned shall be suitably aligned so that it can be converted to a pointer of any complete object type and then used to access the object or array in the storage allocated. 但是你不是這樣寫的啊! 你看看你怎麼寫: int* pInt = reinterpret_cast<int*>(buffer); *pInt = 10; pInt++; double* pDouble = reinterpret_cast<double*>(pInt); 原本的 buffer 保證符合 double alignment 但是你轉成 int* 之後改變了它的值 改變後當然就不一定符合 alignment 了 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.168.87.165
QQ29:L大 針對你說的"改變後當然就不一定符合 alignment" 02/14 23:03
QQ29:這相關的觀念該去看哪邊學習呢, 對於甚麼padding , alignment 02/14 23:04
QQ29:沒有對於這方面有相關認知@@ 比較無法體會改值會出錯的關鍵 02/14 23:05
littleshan: http://www.wretch.cc/blog/gump7014/7473192 02/14 23:18
QQ29:我看完了@@不過還是無法體認 說 轉成int改值後會不一定符合 02/14 23:34
QQ29:alignment是為什麼耶~我不是改值嗎 我沒有動記憶體位址阿~ 02/14 23:34
littleshan:pLongLongPtr++; 這不就是改位址嗎 02/14 23:39
QQ29:喔喔~那若照原來那篇網頁的寫法 可以嗎? 我照他用memcpy 02/14 23:45
QQ29:就沒發出exception, 但是這並沒有避免misalignment吧? 02/14 23:46
QQ29:我跳的記憶體offset是一樣的!? 02/14 23:46
littleshan:為什麼你不用struct? 02/14 23:52
QQ29:因為.....其實我不太理解L大你說的struct + union..... 02/15 00:06
littleshan:union是我誤解了你的意思 你要的用struct就夠了 02/15 01:20
QQ29:所以我需要另外定義一個struct 然後把要寫得資料 02/15 09:00
QQ29:先做一堆的assign 在把整個struct寫下去嗎? 02/15 09:00
QQ29:因為我要寫的資料是某class的某幾個data member~ 02/15 09:01
littleshan:對,不過如果是寫到檔案或網路上,要注意endian 02/15 10:29