C++11引入了
C++17引入了
我的动力是我正在开发一个通用的序列化库。 当它从源(如CBOR)接收到连续的二进制数字数组时,它会检测目标容器是否具有重载的
std::begin(std::valarray&)
和std::end(std::valarray&)
。C++17引入了
std::data()
,它可以与std::vector
、std::array
、C语言风格的数组等一起使用。但为什么没有为std::valarray
引入重载的std::data()
呢?
std::valarray
被指定具有连续的存储空间,可以通过访问a[0]
的地址来访问它(请参见注释)。
std::data(std::valarray& a)
可以简单地被定义为返回&(a[0])
。那为什么没有这样做呢?这是一个疏忽吗?我的动力是我正在开发一个通用的序列化库。 当它从源(如CBOR)接收到连续的二进制数字数组时,它会检测目标容器是否具有重载的
data(container)
函数,一个container.resize(n)
成员函数以及一个合适的value_type
(匹配基本数字类型)。所有三个存在使得可以将源数据直接memcpy()
到目标容器中,从而实现高效。如果有一个std::data(std::valarray&)
的重载,它将使我的生活更加简单。缺少它并不是致命问题,但确实使代码变得更杂乱。
补充说明:我想检测data
函数的原因是它告诉我目标容器是否连续。如果它连续,那么我可以通过std::memcpy
或std::copy
进行高效的字节复制。如果它不连续,那么我必须逐个拆开每个不对齐的源数组数字,并使用push_back
、emplace
等将其附加到目标容器上,具体取决于容器类型。
补充说明2:我决定使用适配器和特征方法来代替检测data
函数的存在。这将更容易支持非标准或用户定义的容器类型。我的问题关于为什么没有std::data(std::valarray& a)
仍然存在。
ADDENDUM 3: 我应该澄清一下,我需要对 CBOR 类型的数组进行这种 hackery,这些数组只能是数字。此外,源缓冲区中的数字未与元素边界对齐。我知道二进制数据可能需要进行大小端交换,并且将字节复制到浮点类型可能会触发奇怪的 NaN 行为,如果不小心处理的话。
我现在后悔提到了我的动机,本来应该让 std::data(std::valarray& a)
的问题独立存在的。这个问题已经变成了一个灾难,哈哈。:-)
std::copy()
/std::copy_n()
为此目的是否有原因,让编译器在可能时进行优化以达到memcpy
的效果呢?您不需要访问每个容器的data()
就可以使用std::copy/_n
,只需使用迭代器即可。” - Remy Lebeaustd::valarray
并不被视为STL
的一部分,因为它不遵循STL
的哲学。 - Galikstd::vector<uint8_t>
的中间复制到std::vector<float>
”- 当然可以,例如:std::vector<uint8_t> buffer; /* 填充buffer ... */ std::vector<float> values(n); std::copy_n(reinterpret_cast<char*>(&buffer[index]), n * sizeof(float), reinterpret_cast<char*>(values.data()));
- Remy Lebeau