在我正在开发的程序中,这个特定的操作肯定不会成为瓶颈,但它确实让我思考。从this one和this one等问题的答案中,我学会了两种方法可以轻松(有效地)将数组中的所有元素设置为零:
double myArray[3];
static const double zeroes[3] = {0};
memcpy(myArray, zeroes, sizeof(zeroes));
和
double myArray[3];
memset(myArray, 0, numberOfElementsInMyArray * sizeof(myArray[0]));
在我提出真正的问题之前:我不完全确定,但基于the information我读过,我认为这种方法至少在原则上会用int
填充数组零(嗯,unsigned char
,但these seem to be fairly equivalent)。那是对的吗?如果是,那么将int
零显式转换为必需的double
个零,或者如果myArray
被声明为double
的数组,它是否隐式完成?
无论如何,我真正的问题是:如果数组不是很大(就像我上面声明的myArray
那样),这些方法中的任何一个仍然比一个小循环更受欢迎吗?如果你有一些相同的小尺寸的数组,所有需要分配的零怎么办?如果评论正确,您是否认为可读性是决策中的一个因素并且有利于特定的解决方案?
完全清楚:我不希望将数组初始化为零。
答案 0 :(得分:2)
如果它只是一个小数组(比如三个元素),那么无论使用mem*
函数还是循环,它都可能不会有太大的区别,或三个不同的任务。事实上,后一种情况甚至可能更快,因为您没有承受函数调用的成本:
myArry[0] = myArray[1] = myArray[2] = 0;
但是,即使一个 更快,差异可能也不值得担心。我倾向于优化可读性然后,如果需要,稍后优化空间/存储。
如果是memcpy
和memset
之间的选择,我选择后者(假设,似乎是这种情况,实际上表示的是全零位模式{{ 1}}在您的实现中)有两个原因:
而且,对于它的价值,您的0.0
解决方案并不需要进行乘法运算。由于您可以获得整个数组的大小,您可以这样做:
memset
答案 1 :(得分:0)
我认为第一种不使用循环设置的方法对性能更好
发生的事情是数组的merroy被0(& 0)bitwised所以它比为数组中的每个元素使用一个循环更快。