?文章來源:http://www.zghlxwxcb.cn/news/detail-842590.html
概述:C++結(jié)構(gòu)體的`sizeof`不總是等于每個成員的`sizeof`之和,因?yàn)閷R和填充影響了內(nèi)存布局。未對齊的結(jié)構(gòu)體可能存在間隙,而對齊的結(jié)構(gòu)體會插入填充以保持對齊。通過示例展示了結(jié)構(gòu)體的內(nèi)存對齊和填充,以及如何使用模板元編程打印結(jié)構(gòu)體成員的偏移量,深入理解內(nèi)存布局。
在C++中,結(jié)構(gòu)體的sizeof并不總是等于每個成員的sizeof之和,這是由于對齊和填充的影響。編譯器為了提高內(nèi)存訪問速度,通常會在結(jié)構(gòu)體成員之間插入一些填充字節(jié)以對齊數(shù)據(jù)。
基礎(chǔ)功能:
示例源代碼:
#include <iostream>
// 未進(jìn)行對齊的結(jié)構(gòu)體
struct WithoutPadding {
char a; // 1 字節(jié)
int b; // 4 字節(jié)
char c; // 1 字節(jié)
};
// 進(jìn)行對齊的結(jié)構(gòu)體
struct WithPadding {
char a; // 1 字節(jié)
char padding[3]; // 對齊填充 3 字節(jié)
int b; // 4 字節(jié)
char c; // 1 字節(jié)
};
int main() {
std::cout << "WithoutPadding 大?。? << sizeof(WithoutPadding) << std::endl;
std::cout << "WithPadding 大小:" << sizeof(WithPadding) << std::endl;
return 0;
}
在這個示例中,WithoutPadding?結(jié)構(gòu)體的大小是 6 字節(jié)(1 + 4 + 1),而WithPadding?結(jié)構(gòu)體的大小是 12 字節(jié)(1 + 3(填充)+ 4 + 1)。這是因?yàn)榫幾g器為了對齊int類型的成員b,在其前面插入了3字節(jié)的填充。
高級功能:
示例源代碼:
#include <iostream>
#include <type_traits>
template <typename T>
void PrintOffsets() {
std::cout << "Offsets for " << typeid(T).name() << ":" << std::endl;
size_t offset = 0;
size_t size = sizeof(T);
// 使用模板元編程逐個打印成員的偏移量
// 對于 C++17,可以使用 std::is_standard_layout<T> 確保是標(biāo)準(zhǔn)布局類型
if constexpr (std::is_standard_layout<T>::value) {
while (offset < size) {
std::cout << " Offset of member at index " << offset << ": " << offsetof(T, offset) << std::endl;
offset++;
}
} else {
std::cout << " Not a standard layout type." << std::endl;
}
std::cout << std::endl;
}
struct ExampleStruct {
char a; // 1 字節(jié)
int b; // 4 字節(jié)
char c; // 1 字節(jié)
};
int main() {
PrintOffsets<ExampleStruct>();
return 0;
}
在這個示例中,PrintOffsets?函數(shù)使用模板元編程逐個打印結(jié)構(gòu)體成員的偏移量。ExampleStruct?結(jié)構(gòu)體包含了對齊填充,通過offsetof宏可以獲取每個成員的偏移量。這有助于理解結(jié)構(gòu)體內(nèi)存布局的細(xì)節(jié)。
通過這兩個示例,展示了結(jié)構(gòu)體大小不等于成員sizeof之和的原因,以及如何使用模板元編程逐個打印結(jié)構(gòu)體成員的偏移量。這些知識有助于理解內(nèi)存對齊和結(jié)構(gòu)體內(nèi)存布局。
?
文章來源地址http://www.zghlxwxcb.cn/news/detail-842590.html
到了這里,關(guān)于C++結(jié)構(gòu)體內(nèi)幕揭秘:sizeof之謎與內(nèi)存布局探秘的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!