繁体   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