veh*_*zzz 23 c c++ optimization performance
double d[10];
int length = 10;
memset(d, length * sizeof(double), 0);
//or
for (int i = length; i--;)
d[i] = 0.0;
Run Code Online (Sandbox Code Playgroud)
sha*_*oth 41
如果你真的在乎你应该尝试和衡量.但是最便携的方法是使用std :: fill():
std::fill( array, array + numberOfElements, 0.0 );
Run Code Online (Sandbox Code Playgroud)
cod*_*nix 24
请注意,对于memset,您必须传递字节数,而不是元素数,因为这是一个旧的C函数:
memset(d, 0, sizeof(double)*length);
Run Code Online (Sandbox Code Playgroud)
memset 可以更快,因为它是用汇编语言编写的,而std::fill模板函数只是在内部循环.
但是对于类型安全和更易读的代码,我建议 std::fill() - 它是c ++的处理方式,并考虑memset代码中这个地方是否需要性能优化.
for*_*ran 12
试试这个,如果只是为了酷xD
{
double *to = d;
int n=(length+7)/8;
switch(length%8){
case 0: do{ *to++ = 0.0;
case 7: *to++ = 0.0;
case 6: *to++ = 0.0;
case 5: *to++ = 0.0;
case 4: *to++ = 0.0;
case 3: *to++ = 0.0;
case 2: *to++ = 0.0;
case 1: *to++ = 0.0;
}while(--n>0);
}
}
Run Code Online (Sandbox Code Playgroud)
小智 6
除了代码中的一些错误和遗漏之外,使用memset是不可移植的.您不能假设所有零位的double都等于0.0.首先使您的代码正确,然后担心优化.
假设循环长度是一个整数常量表达式,最好的结果是良好的优化器将识别for循环和memset(0).结果是生成的程序集基本相同.也许寄存器的选择可能不同,或者设置不同.但每双的边际成本应该是一样的.
| 归档时间: |
|
| 查看次数: |
28699 次 |
| 最近记录: |