C++ 向量上的memset<;int>;

C++ 向量上的memset<;int>;,c++,vector,stl,memset,C++,Vector,Stl,Memset,正如使用memset一样,我在向量上使用memset为所有元素赋值 memset(&match_begin[0], 0xff , sizeof(match_begin[0]) * match_begin.size()); 与std::fill相比,它的性能确实有了显著的提高,而且运行良好(g++4.3.2,64位linux)。这段代码是否安全,如中所示,std::vector实现是否总是保证数据的内存分配是连续的?在stl库的未来(或不同)实现中,这是否可能在以后更改并破坏我的代码 s

正如使用memset一样,我在
向量上使用memset为所有元素赋值

memset(&match_begin[0], 0xff , sizeof(match_begin[0]) * match_begin.size());
与std::fill相比,它的性能确实有了显著的提高,而且运行良好(g++4.3.2,64位linux)。这段代码是否安全,如中所示,std::vector实现是否总是保证数据的内存分配是连续的?在stl库的未来(或不同)实现中,这是否可能在以后更改并破坏我的代码

std::vector实现是否总是保证内存 数据的分配将是连续的

是的。在C++03标准中,在23.2.4/1处有相等的字符串

一个 向量是连续存储的,这意味着如果v是一个向量,T是另一种类型


然后它服从标识&v[n]=&v[0]+n对于所有0从内存的角度来看这应该是安全的


请记住,如果向量的内容不是纯数据类型,就不应该做这种事情

memset使用bool类型的vector失败,请尝试下面的示例,尽管正如其他人所提到的,它适用于其他普通数据类型。我共享它只是为了使它显式化,它不适用于所有普通数据类型

#include <vector>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    vector<bool>vec;
    vec.push_back(0);
    vec.push_back(1);
    memset(&vec[0], 0, sizeof(vec[0]) * vec.size());
    return 0;
}
#包括
使用名称空间std;
int _tmain(int argc,_TCHAR*argv[]
{
向量向量;
向量推回(0);
向量推回(1);
memset(&vec[0],0,sizeof(vec[0])*vec.size();
返回0;
}

我在哪里可以找到任何证明这一点的文档?即使我觉得你是对的,你仍然可以提供一些来源吗?谢谢你提供的章节号,但是你从哪里获得了这些信息?你能提供一个链接吗?@MIkhail我刚把链接放在那里。是的,这是真的。它必须是POD。<代码> STD::填充< /代码>显然更干净,考虑“代码> MyStuts<代码>的唯一原因是性能。你是如何衡量绩效差异的?gcc有一个优化功能,可以识别类似于memset的循环,并用对memset的调用来替换它们。@Marc,在我的函数中,我不小心同时放入了memset和fill。实际上,在性能上没有任何明显的差异。我的代码读取tcp流中的每个数据包。通过发送一个大文件并测量时间,我对性能有了基本的了解。
#include <vector>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    vector<bool>vec;
    vec.push_back(0);
    vec.push_back(1);
    memset(&vec[0], 0, sizeof(vec[0]) * vec.size());
    return 0;
}