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