我試圖理解爲什麼結構填充的原因是結構不能memcmp進行比較。我不明白約結構填充 一個小事情是這樣的...... 爲什麼要「a short be 2 byte aligned"
或"a long be 4 byte aligned"
。我的理解是它們的大小,但爲什麼他們沒有在任何字節邊界出現?結構填充
或者換句話說"why is 0x10004566 not a valid location for a long variable but 0x10004568 is?"
我試圖理解爲什麼結構填充的原因是結構不能memcmp進行比較。我不明白約結構填充 一個小事情是這樣的...... 爲什麼要「a short be 2 byte aligned"
或"a long be 4 byte aligned"
。我的理解是它們的大小,但爲什麼他們沒有在任何字節邊界出現?結構填充
或者換句話說"why is 0x10004566 not a valid location for a long variable but 0x10004568 is?"
內存對齊是一個很重要的問題,優化速度的程序時。 C,是一種語言 - 一般 - 着重強調速度,喜歡執行一些規則可能使程序速度更快。
的對齊和未對齊的內存的限制訪問來自用於從存儲器,其通常取它在組塊,其等於在尺寸機器字獲取數據的硬件直接來自。假設你要訪問存儲在位置101一個雙字(4個字節),這意味着內存控制器將首先必須在位置100,然後又在位置104一個雙字的讀(可能)發出一個雙字的讀,和然後將來自位置101,102,103和104的各個字節拼接在一起。整個操作需要(假設)兩個時鐘週期。
如果你想在位置100訪問一個雙字,有沒有這樣的問題,應該由我提供的例子來說明不夠清楚。
實際上,未對齊的數據訪問是一個如此大的問題,以至於如果您嘗試訪問SSE指令(「對齊」版本,也有「未對齊」版本,則不會這樣做)會導致一般性保護錯誤與這些數據錯位。作爲一個經驗法則,從4字節邊界上的4字節數據,8字節邊界上的8字節數據等等對齊,從不會感到痛苦。
因爲某些平臺上(即CPU)的物理不支持「未對齊」的內存訪問,其他平臺都支持他們,但在慢得多的方式。
你在結構中獲得的填充取決於你的編譯器做出的選擇,但它會做出這些選擇以滿足代碼針對的CPU的具體要求。
關於對齊方式,我能想到的唯一附加示例是數據傳輸,數據傳輸(取決於體系結構)例如以32字節爲單位,例如,如果數據跨越邊界,則可能需要2轉移到接收數據,而不是1
如果你一路走向零,從0x10004566開始,你可以放4個字節的第一個位置是0x00000002,從而「浪費」2個字節的存儲器(字節0x00000000和0x00000001)。 – pmg 2012-01-17 23:56:09
有道理。但是與附加填充(發生很多次)相比,不足2個字節的空間足夠小。 – 2012-01-18 00:01:42
想象一下,你想購買電池。他們進來8包,但你只需要7 ...所以你打開數據包,並刪除1.下一次你想要另一個7 ...所以你拿剩下的1,打開另一個包,並刪除2.和等等...現在想象你得到8並且扔掉1。下一次你得到另一個8並扔掉另一個,...... ---字節比電池便宜:) – pmg 2012-01-18 00:16:21