[英]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.