讀寫

2013-08-22 24 views
2

我與必要的填充下面的32位對齊的結構,保證了i32數據成員的32位對齊:讀寫

struct 
{ 
    std::uint8_t i8; 
    std::uint32_t i32; 
} x, y = {0}; 

在填充比特寫入具有一個明確的行爲?例如,在代碼:

reinterpret_cast<std::uint32_t&>(x) = 256u; 

是填充部分總是寫入和讀取爲1?

另一個問題:

是填充總是初始化爲0 y

我明白,從而C++ [dcl.init]狀態:

要零初始化對象或類型T的參考是指:如果T是一個 非工會類型,每個非-static數據成員,並且每個基類 子對象零初始化和填充被初始化爲零位

然而,我沒有看到在Microsoft編譯這種行爲(VC++ V120),例如:

reinterpret_cast<std::uint32_t&>(y) == 0u 

未評估爲true。這可能是一個缺失的功能,或者我誤解了標準中的短語。

+0

'y'未初始化爲零,它的值初始化。初始化規則是超級不直觀和令人困惑的。 –

+0

這就是說,我來到這裏找到你的問題的第一部分的答案:(可悲的是,這裏沒有答案 –

回答

0

我不是填充專家,但我不相信有可能保證任何填充,至少不是沒有特殊的和可能的實現特定的選項。

對於除了要轉換回原始指針之外的任何內容,未使用reinterpret_cast的定義行爲。 reinterpret_cast意味着你在代碼中做了一些狡猾的事情。在這種情況下

什麼填充這個問題的會談被初始化爲 Is zero initialization of structures guaranteed to wipe padded areas?

+1

我不認爲他想保證填充存在太多沒有未定義的行爲如果存在填充。 –