2017-08-11 98 views

回答

6

快速回答; C++的POD類型≈Rust的Copy types

但是,還有一些其他的相關概念。讓我們詳細討論它們!


Copy性狀在C最接近於術語「POD類型」 ++和定義如下:

類型,其值可以通過複製位簡單地重複。

通過「複製位」,文檔基本上是指memcpy()。這包括所有基元類型,例如u32,f32,charbool,但用戶定義的類型也可以是Copy。通常的特點是簡單衍生

#[derive(Clone, Copy)] 
struct Point { 
    x: f32, 
    y: f32, 
} 

你可能已經注意到了Clone:在Clone traitCopy要求,並定義爲:

的明確複製能力的一個共同特點一個東西。

Clone說,一個類型是「在某種程度上能夠複製自身」和Copy需要更多的說的類型是「能夠通過僅僅複製型的位複製本身」。


C++答案指出POD類型不包含「構造函數,析構函數和虛擬成員函數」。讓我們打破下來生鏽:

  • 構造:鐵鏽沒有專門的構造方法,而是使用相關功能(在C靜態方法++)。每種類型,即使是所有類型,都可以擁有儘可能多的相關功能和方法。在Rust這並不是真正的「POD」要求。特別是,即使Rust的原始類型也有很多方法,如u32::pow()。此限制不適用於Rust。

  • 析構函數:拉斯特,目的是通過從Drop性狀主叫drop()破壞(或更確切地說:drop()自動在範圍結束調用)。 當他們實現Drop特性時,類型不能爲Copy Rust在這裏有類似的限制。

  • 虛擬成員函數:拉斯特,虛擬不是一個函數的性質。大多數函數都可以在虛擬環境中使用,即:它們可以與動態分派一起使用,但是Copy不會阻止某個類型在動態分派上下文中使用(以Rust術語:用作特徵對象)。這部分要歸功於vptr沒有存儲在類型中,而是指向對象的指針(胖指針)。這一點不適用於Rust。