2013-05-10 28 views
1

說我有像複製在C++風格一個結構的緩衝

typedef struct { 
    unsigned char flag, type; 
    unsigned short id; 
    uint32 size; 
} THdr; 

一個結構和數據從一個UDP交際未來的緩衝器,我有個字節的緩衝器,其大小(datadata_size) 。數據大小大於sizeof(THdr)

該結構位於緩衝區的開頭,我想將其複製到代碼THdr Struct_copy中定義的結構中。

我知道我可以使用memcpy(&Struct_copy,data[0],sizeof(Struct_copy));但我想使用「C++風格」的方式,就像使用std::copy一樣。

任何線索?

+0

如果你有一個單線實現的實現,爲什麼它會變得複雜(而且很可能會放慢速度),因爲你想要更「時髦」的東西? 'memcpy'對此是一個很好的解決方案,就是這樣。 – 2013-05-10 13:44:44

+1

使用'std :: memcpy'來代替:-)'std ::'使它更加C++ ish! – deepmax 2013-05-10 13:47:50

+0

,因爲根據編譯器的memcpy可以比std :: copy慢,至少是他們在http://stackoverflow.com/questions/4707012/c-memcpy-vs-stdcopy – BiA 2013-05-10 13:49:59

回答

1

如何像

THdr hdr; 
std::copy(&hdr, &hdr + 1, reinterpret_cast<THdr*>(data)); 

如果一個THdr結構複製從datahdr

它也可以是簡單得多:

THdr hdr; 
hdr = *reinterpret_cast<THdr*>(data); 

在C這個最後的作品還有:

THdr hdr; 
hdr = *(THdr *) data; 

何不創建一個構造函數的數據作爲輸入?像

struct THdr 
{ 
    explicit THdr(const unsigned char* data) 
     { 
      THdr* other = reinterpret_cast<THdr*>(data); 
      *this = *other; 
     } 

    // ... 
}; 

那麼就可以使用,如

THdr hdr(data); 
+0

'reinterpret_cast'沒有運行時效率懲罰嗎? – deepmax 2013-05-10 13:50:53

+0

@MM。不,它只是告訴編譯器將一種類型視爲另一種類型,即它應該「重新解釋」類型。 – 2013-05-10 13:52:56

+0

也許「重新解釋」會增加成本......它是否花費編譯時間或運行時間?我是一個小混混! – deepmax 2013-05-10 13:57:05

2

沒有「聰明」的方式在C這樣做++。如果它不涉及memcpy,那麼您需要std::copy,您將必須使用強制轉換爲const unsigned char *以使源和/或目標的數據類型匹配。

「複製一些數據」有很多其他的方式,比如打字,但是再一次,它不是比memcpy更好的解決方案 - 只是不同而已。如果你的當前代碼沒有問題,那麼我不明白爲什麼你應該改變它。C++代碼的設計是爲了接受C代碼,所以如果你當前的代碼沒有問題,那麼我不明白爲什麼你應該改變它。

相關問題