使用std :: byte标准化,我们何时使用void*和一个字节*?

ein*_*ica 9 c++ byte idiomatic c++17

C++ 17将包括std::byte一种用于一个可原子寻址的存储器单元的类型,在典型的计算机上具有8位.

在这种标准化之前,指向"原始"内存时已经存在一些困境 - 在一方面使用char*/ unsigned char*另一方面void *.现在,void *删除了偏好的原因之一- std::byte没有与a相同的内涵char; 它是关于原始内存,而不是字符.

所以,我的问题是:什么是一个很好的经验法则std::byte,关于何时更喜欢它void *以及什么时候相反?


当然,当你处理旧代码或C代码时,你会受到它所接受的约束; 我主要是指新代码,您可以选择所有类型.

ein*_*ica 5

(这是一个潜在的经验法则,浮现在我的头上,没有被任何人宽恕。)

经验法则:什么时候使用哪种指针?

  • 使用char *一系列文本字符的序列,而不是别的。
  • 使用void *的类型擦除的设置,即当指针指向的数据被输入,但由于某些原因,类型化的指针不得使用,否则无法确定无论是打字或没有。
  • 使用byte *了原始内存为其中有持有任何类型的数据没有它的指示。

上面的例外:

  • 当较旧或非C ++强迫您使用时,也请使用void */ char *,否则将使用byte *-,但应byte *尽可能紧密地使用基于-的接口包装它,而不是将其暴露给其余的C ++代码。

例子

void * my_custom_malloc(size_t size)- 错误
byte * my_custom_malloc(size_t size) - 正确

struct buffer_t { byte* data; size_t length; my_type_t data_type; }- 错误
struct buffer_t { void* data; size_t length; my_type_t data_type; } - 正确