[英]Size of singly inherited derived classes
以下代碼( 在線版本 )是基於Stanley Lippman的“ Inside C ++ Object Model”一書的第3.4節(請參見硬拷貝的第85-86頁或PDF版本的第64頁)。
#include <iostream>
#include <cstddef> // defines offset
struct Base
{
int w;
char x;
};
struct Derived1 : Base
{
char y;
};
struct Derived2 : Derived1
{
char z;
};
int main()
{
std::cout << "sizeof(Base) = " << sizeof( Base ) << "\n";
std::cout << "sizeof(Derived1) = " << sizeof( Derived1 ) << "\n";
std::cout << "sizeof(Derived2) = " << sizeof( Derived2 ) << "\n";
std::cout << "Offset of x in Derived2 = " << offsetof( Derived2 , x) << "\n";
std::cout << "Offset of y in Derived2 = " << offsetof( Derived2 , y) << "\n";
std::cout << "Offset of z in Derived2 = " << offsetof( Derived2 , z) << "\n";
}
根據文本,Derived2被假定為(?)大小為16個字節(假定為32位計算機),但是在gcc上,我得到12個字節。 但是在Visual Studio上,其大小正確(?)報告為16個字節。 這是gcc回歸錯誤還是標准未定義的問題?
編輯
大師Stanley Lippman 沒有使用offsetof
宏。 那是我做的
宏offsetof
只能用於標准版式類型。 由於Derived1
和Derived2
都不具有標准布局,因此您的行為是不確定的。
除此之外,C ++標准沒有對非靜態數據成員的布局做出任何特別的保證,因此,如果一種布局與您對另一種布局的期望不符,則它並不是“錯誤”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.