簡體   English   中英

C ++中sizeof的行為

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

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