簡體   English   中英

對齊的結構/類對象的填充字節中存儲了哪些值

[英]What values are stored in the padding bytes of an aligned struct/class object


struct Data
{
    std::uint32_t b;
    char a;
};

數據類型按 4 個字節對齊,因此 sizeof(Data) == 8。

但是第 5-7 個字節中的值是什么? 默認為零嗎?

它實際上取決於一些事情,所有這些都在 C++ 標准[dcl.init]詳細說明。

根據存儲持續時間,各種類型的構造函數的存在等,該部分的各個部分最終會進行默認初始化、零初始化或值初始化。

默認初始化意味着整個變量將是某個任意值,而零初始化零初始化所有成員並將填充字節設置為零。

所以Data d1; static Data d2; 不一定具有相同的填充字節。

值初始化有點復雜,因為它在調用構造函數(如果存在)之前有效地首先選擇默認或零初始化。


但最重要的是,這可能無關緊要。 如果填充的內容很重要,您應該將該空間“注冊”為真正的成員變量,以便您可以使用它們(並正確初始化它們)。 填充在變量的“值”中非常不重要,除非你做一些瘋狂的事情,比如memcmp it,或者在它占據的整個內存塊上運行校驗和:-)

我始終認為它是不可預測的,但仍然不確定結構的對象是否具有靜態存儲持續時間。

因此,我進行了搜索,以查看 C 標准和 C++ 標准中是否有明確提及這一點(因為您是在 C 和 C++ 中詢問的)。

用C標准(C99,C11和C18)中提到:

J.1 未指明的行為

  • 在結構或聯合中存儲值時的填充字節值 (6.2.6.1)。

對於 C++,我找不到在 C++ 標准中的任何地方提到它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM