我期待一个连续容器上的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或其他高级矢量化代码来完成.请给我一个提示.谢谢.
针对您的具体示例double,它必须是特定于平台的优化,并且很可能g ++决定不做这样的事情.究其原因当然是使用的表示任何平台double为其0.0并不意味着所有零个字节.另外,设置为除零以外的任何数字都是完全不同的游戏,因为它不仅仅是将每个字节设置为零:需要遵循特定的模式.负数会变得更糟.
除非你有特定的分析信息,所以fill需要的时间要长得多,memset我不会太担心它.如果花费更长的时间,您可以手动调整以手动使用memset或尝试解决根本原因,需要重复设置为零.
| 归档时间: |
|
| 查看次数: |
4277 次 |
| 最近记录: |