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