std :: fill不会变成POD类型的memset

xis*_*xis 12 c++

我期待一个连续容器上的std :: fill,比如说std :: vector,会自动编译成memset的调用.但是,当我尝试以下代码时

#include <vector>
#include <algorithm>
#include <numeric>

using namespace std;

int main()
{
    vector<double> vec(300000);

    fill(vec.begin(),vec.end(),0.0);

    memset(&vec[0],0,vec.size()*sizeof(double));
}
Run Code Online (Sandbox Code Playgroud)

gcc将第一个std :: fill编译成一个简单的循环.但我认为可以通过SSE或其他高级矢量化代码来完成.请给我一个提示.谢谢.

wil*_*ell 5

该标准不强制实施者使用memset()。但例如gcc确实memset()用于std::fill()的容器char


Mar*_*k B 5

针对您的具体示例double,它必须是特定于平台的优化,并且很可能g ++决定不做这样的事情.究其原因当然是使用的表示任何平台double为其0.0并不意味着所有零个字节.另外,设置为除零以外的任何数字都是完全不同的游戏,因为它不仅仅是将每个字节设置为零:需要遵循特定的模式.负数会变得更糟.

除非你有特定的分析信息,所以fill需要的时间要长得多,memset我不会太担心它.如果花费更长的时间,您可以手动调整以手动使用memset或尝试解决根本原因,需要重复设置为零.

  • @MarkB:这并没有真正解释为什么海湾合作委员会不这样做.他们显然知道他们正在编译哪个平台,以及这样的优化是否安全. (8认同)