簡體   English   中英

單繼承派生類的大小

[英]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只能用於標准版式類型。 由於Derived1Derived2都不具有標准布局,因此您的行為是不確定的。

除此之外,C ++標准沒有對非靜態數據成員的布局做出任何特別的保證,因此,如果一種布局與您對另一種布局的期望不符,則它並不是“錯誤”。

暫無
暫無

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

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