簡體   English   中英

void *或char *用於通用緩沖區表示?

[英]void* or char* for generic buffer representation?

我正在設計一個Buffer類,其目的是代表一塊內存。

我的底層緩沖區是一個char* (嗯,實際上是boost::shared_array<char> ,但它並不重要)。

我一直在決定為我的構造函數選擇什么樣的原型:

我應該去:

Buffer(const void* buf, size_t buflen);

或者:

Buffer(const char* buf, size_t buflen);

或者是其他東西 ?

通常做什么,為什么?

對於構造函數和其他API函數, void*的優點是它允許調用者將指針傳遞給任何類型,而不必進行不必要的強制轉換。 如果調用者能夠傳遞任何類型是有意義的,那么void*是優選的。 如果調用者能夠傳入char*真的有意義,那么使用該類型。

如果緩沖區具有void *類型,並且string具有char *類型,則API接口對用戶更清晰。 比較memcpy和strcpy函數定義。

C ++ 17

C ++ 17專門為此引入了std::byte

它的定義實際上很簡單: enum class byte : unsigned char {};


我通常使用unsigned char作為底層結構(不希望簽名搞亂我的緩沖區因為我知道是什么原因)。 但是我經常輸入它:

// C++11
using byte = unsigned char;

// C++98
typedef unsigned char byte;

然后將其稱為byte* ,它在我看來整齊地傳達了含義,至少比char*void*更好。

我更喜歡char* ,因為就我而言,它更適合作為“緩沖區”。 void*似乎更像是“指向我不知道的東西”。 此外,無論如何,這都是你的基礎。

我推薦uint8_t,它在stdint.h中定義。 它與“typedef unsigned char byte”基本相同; 其他人一直在推薦,但它具有成為C標准一部分的優勢。

至於void *,我只會將其用於多態。 即。 如果我還不知道它會指向什么類型的東西,我只會調用一些無效指針。 在你的情況下,你有一個字節數組,所以我通過使用uint8_t *作為類型來標記它。

我更喜歡unsigned char *uint8_t *用於緩沖區實現,因為void *有一個煩人的限制,你不能對它執行指針數學運算。 因此,如果你想在緩沖區的某個偏移量處理一些數據,或者只是將緩沖區分成塊或其他什么,那么無論如何你都會被投射到其他類型來進行數學運算。

我更喜歡unsigned char *uint8_t * over plain char *因為有關別名和char *特殊規則 ,它有可能嚴重地使緩沖區上的某些循環變得悲觀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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