将所有数组元素设置为整数

Joh*_*ohn 4 c++

我有一个阵列,

int a[size];

我想将所有数组元素设置为 1

因为数组中的某些索引已经设置为,1所以最好使用条件语句检查每个元素,如

for (int index = 0; index < size; index++)
{
    if (a[index] != 1)
      a[index] = 1;
}
Run Code Online (Sandbox Code Playgroud)

或者设置所有索引无论如何.会有什么区别?

Jon*_*eid 15

您的代码在循环中有两个路径,具体取决于每个值:

  1. 从数组,比较和分支中读取
  2. 从数组中读取,比较和写入

那不值得.写吧.

如果您愿意,也可以通过致电来完成同样的工作

std::fill(a, a + size, 1);
Run Code Online (Sandbox Code Playgroud)

如果数组是类型char而不是int,它可能会调用memset.特定于平台的实现fill可以提供编译器优化提示.

  • `std :: fill(&a [0],&a [size],1)`可以调用[undefined behavior](http://stackoverflow.com/questions/3144904/may-i-take-the-address-of-一个接一个元素的数组封闭的元素,所以我用kosher版本`std :: fill(a,a + size,1)`替换它. (3认同)

In *_*ico 14

只需将所有元素设置为1.首先是简单和可读性的代码.如果您发现代码运行速度太慢,请对其进行分析以查看需要进行哪些改进(尽管我非常怀疑性能问题可能来自将整数数组的元素设置为某个值).

  • 我应该补充说,无论哪种方式都会有内存访问,并且分支操作在大多数CPU上相对昂贵,因此即使没有分析器,简单分配也可能更有效. (4认同)

Ama*_*9MF 5

我猜你只是在寻求理解,而不是在与一个真正的性能问题作斗争...这只是不会出现在测量中,这就是为什么:

通常,每当缓存的内存处理器(即当今大多数台式机CPU)必须向内存写入值时,必须从(相对较慢的)RAM中读取包含该地址的缓存行.然后通过CPU写入缓存来修改该值.整个高速缓存行最终写回主RAM.

当您在一系列连续地址(如阵列)上执行操作时,CPU将能够在写回之前在一个高速缓存行上非常快速地执行多个操作.然后它移动到下一个缓存行,该缓存行之前是预期获取的.

最有可能在写入值之前执行测试与仅仅写入有多种不同之处有几个原因:

  1. 分支预测使该过程非常有效.
  2. 编译器将完成一些非常强大的优化.
  3. 到高速缓存RAM的存储器传输将是实际速率确定步骤.

所以只需编写代码即可.如果你仍然好奇,测量差异.