woo*_*tok 5 c++ stl vector memset
根据Mark Ransoms关于使用 memset 的回答,我在 a 上使用 memsetvector<int>为所有元素分配值。
memset(&match_begin[0], 0xff , sizeof(match_begin[0]) * match_begin.size());
Run Code Online (Sandbox Code Playgroud)
它确实有显着的性能改进,std::fill并且运行良好(g++ 4.3.2,64 位 linux)。这段代码是否安全,如中所示,std::vector 实现是否总是保证数据的内存分配是连续的?在 stl 库的未来(或不同)实现中,这是否有可能在以后更改并破坏我的代码?
std::vector 实现是否总是保证数据的内存分配是连续的
是的。23.3.6.1/1。在 C++03 标准中,23.2.4/1 处有相等的字符串
向量的元素是连续存储的,这意味着如果 v 是一个向量,其中 T 是 bool 以外的某种类型,那么它遵循恒等式 &v[n] == &v[0] + n 对于所有 0 <= n < v 。尺寸()
在 stl 库的未来(或不同)实现中,这是否有可能在以后更改并破坏我的代码?
不。矢量应该始终是连续的。
但是,在 gcc 4.6.3 中只有一种填充优化,使用 memset。此优化适用于字符类型
// Specialization: for char types we can use memset.
template<typename _Tp>
inline typename
__gnu_cxx::__enable_if<__is_byte<_Tp>::__value, void>::__type
__fill_a(_Tp* __first, _Tp* __last, const _Tp& __c)
{
const _Tp __tmp = __c;
__builtin_memset(__first, static_cast<unsigned char>(__tmp),
__last - __first);
}
Run Code Online (Sandbox Code Playgroud)