我应该用GSL跨度替换(void*,size)吗
Should I replace (void*, size) with a GSL span?
假设我有
int foo(void* p, size_t size_in_bytes);
并且假设使CCD_ 1类型化是没有意义的。我想成为一名优秀的程序员并应用C++核心准则。具体来说,我想使用跨度而不是(*,len)对。嗯,span<void>
不会编译(不能添加到void *
);而span<char>
或span<uint8_t>
等将意味着foo实际期望的是字符,而它可能不是。
那么,在这种情况下,我应该使用span<something-with-size-1>
,还是坚持使用void*
?
这个问题没有一般的答案。
对于一个函数来说,它采用span<T>
意味着它采用了一个连续的值数组,而没有任何形式的所有权转移。如果该描述不能合理地表示正在发生的事情,那么就不应该使用span<T>
。
例如:
如果函数检查缓冲区是否与我的内存空间中的一个区域相交,比如说,映射到一个文件,该怎么办?
这听起来不像foo
0。听起来你应该有一个简单的聚合,它的名字能清楚地表明它的意思:
struct memory_region
{
void* p;
size_t size_in_bytes;
};
你甚至可以给它一个成员函数来测试交叉点。如果您正在制作一个用于处理此类内存区域的系统,我可能会建议使用构造函数等更封装的类类型。
函数的类型应该解释数据的含义。这个意思最好是一般意义上的,但至少,它应该说明它对所讨论的函数意味着什么。
还有一件事:
或
span<uint8_t>
等都意味着foo实际上需要字符
不,不会。虽然uint8_t
几乎肯定与unsigned char
具有相同的大小,但这并不意味着期望能够将字符数组传递给任何使用span<uint8_t>
的函数。如果该函数想宣传它接受字符,它会使用unsigned char
。
我的意思是说
span<whatever>
将意味着函数期望whatever
。
是的,span
s的要求是向它传递给定大小的T
s的实际数组。
C++标准化委员会提出的建议是,如果你想传递一个指向字节序列的指针(这通常是人们传递void*
时想要做的),那么你就传递一个span<std::byte>
,它依赖于一个新的std::byte
类型。然而,这需要对语言标准进行一点小小的修改才能合法。
在今天的C++中,您可以传递span<unsigned char>
(您发现最具描述性的typedef'd),并获得相同的效果:访问一个字节序列。
我选择实现一个名为memory_region
的类,它具有gsl::span
的所有类型内特定功能(因此,例如,它没有begin()或end())。这是而不是与字节跨度IMO-在结构上我永远不会把它们混淆。
这是我的实现(它是与DBMS相关的GPU内核和我正在开发的测试框架的存储库的一部分,因此是与CUDA相关的片段;它取决于一些GSL,在我的情况下,我认为MS的GSL-lite也应该可以)。
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 在c++类上调用void函数
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 在派生函数中指定void*参数
- C++为什么尽管我调用了void函数,它却不起作用
- 如何从void函数输出字符串
- 我应该使用什么来代替void作为变体中的替代类型之一
- 奇怪的结构&GCC&clang(void*返回类型)
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 大于65535的C++数组[size]引发不一致的溢出
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 引用一个已擦除类型(void*)的指针
- 为什么(-1)%vector::size()总是返回0
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 将尾部调用void(i32,..)位转换为llvm::函数以获取FnAttribute
- C++中的大小释放:全局运算符delete的正确行为是什么(void*ptr,std::size_t size)
- 我应该用GSL跨度替换(void*,size)吗
- Char size and const void*
- 为什么 gcc 4.9.0 中没有定义"void operator delete(void* ptr, std::size_t size) noexcept;"?