2015-03-02 92 views
3

我發現這個片的C++代碼,使用memset的()來初始化的對象:memset()在構造函數中初始化對象?

struct Message 
{ 
    Message() 
    { 
     memset(this, 0, sizeof(Message)); 
    } 

    unsigned int a, b, c; 
}; 

由於這是一種POD結構,這種代碼應該罰款。
有在用memset,而不是如構造任何優勢:

Message() : a(0), b(0), c(0) {} 
+4

考慮如果您的對象具有虛擬表格指針會發生什麼。好的編譯器很可能會在第二種情況下確定你有POD和memset它們或類似的東西。但如果稍後決定建立一個層次結構,那麼你就會搞砸了。 – Spo1ler 2015-03-02 11:04:53

+0

如果添加新字段,它將自動設置爲0,無需額外的工作。這是我看到的唯一優勢。 – Ivan 2015-03-02 11:06:26

+5

至少在memset之前/之後插入'static_assert'。這告訴人類讀者以及編譯器,你假設消息是POD;如果不是,編譯器將會失敗,讀者會知道爲什麼你認爲memset是可以的。 – leemes 2015-03-02 11:11:09

回答

4

有使用memset()像這樣沒有任何優勢。離開所有的明顯的弊端和未來痛苦的背後,還有一個缺點,使得它比

Message() : a(0), b(0), c(0) {} 

這是因爲POD s的通常存儲在陣列效率較低。那麼好(智能)編譯器將有優勢與單memset()來替代多個對象的初始化在數組中的

Message * messages_1 = new Message[100]; 

或者

std::vector<Message> messages_2; 
messages_2.resize(100); 

情況下,即使正在建設只單個對象,好的編譯器會在幕後使用memset()

相關問題