[英]behaviour of sizeof in c++
當我在c ++中執行sizeof時,是否確定會得到“整個對象”? 我問是因為我要使用memcpy將對象復制到內存的其他區域(從一開始可能是個愚蠢的主意,對吧?)。
我擔心的是,我可能無法獲得整個對象,而只能獲得屬於它的類的部分,而現在它只能轉換為該類。 這有意義嗎?還是我感到困惑?
編輯示例
class A{ public: int a = 123; };
class B: public A{ public: int b = 321; };
class C : public B{ public: int c = 333; };
C c_ = C();
B b_ = C();
A a_ = C();
std::cout << sizeof(a_) << " , " << sizeof(b_) << " , " << sizeof(c_) << std::endl;
似乎給我4,8,12。
我想我需要進行動態轉換以弄清楚如何獲得在每種情況下構造為“ C”類的“整個”對象?
sizeof
將始終返回對象的靜態大小。 注意,在您的示例中,它將與真實對象的大小一致,因為沒有多態性。 當你做
A a = B();
a
是 A
類型A
-您剛巧用新的B
對象初始化一個新的A
對象,這導致切片( a
用與A
相同的B()
字段初始化)。
一個更好的例子是:
B b;
A *a = &b;
在這種情況下, *a
確實將是動態類型B
,但是sizeof(*a)
仍將返回sizeof(A)
,而不是sizeof(B)
。
有幾種方法可以獲取對象的動態大小:
return sizeof(*this);
並在所有派生類中重新定義它。 話雖這么說,后一種方法並不是特別有用,因為對非平凡類型(例如多態類)進行memcpy
是未定義的行為(因此,即使第一種方法也是如此,因為我想您會這樣做具有多態類型)。
要復制多態類的問題的常見方法是接受這樣的事實,他們將不得不生活在堆和定義clone()
方法,它virtual A * clone() {return new B(*this);}
其中B
是派生類)在每個派生類中,並在需要副本時調用clone()
。
提醒您,您可以運用一些小技巧。 一旦我有了一個類層次結構,該類層次結構具有一個虛擬方法,該方法為每個派生類分配new
的位置,為析構函數分配一個new
的位置,但是您確實必須知道自己在做什么(在我的情況下,我是通過包含實例的union
調用它們的對於每個派生類,因此大小和對齊方式都不是問題)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.