c++中数组赋值的性能问题

c++中对于以下两种赋值方式,那种效率更高呢?

第一种:array[i] = N;

第二种:*(array+i)=N;

请大家帮忙解答一下,万分感谢。

个人认为没区别呢

好像第二种效率更高一些。

我是在项目中测的,跑的代码的主要工作就是数组赋值,测试数据类型是int32,数据量分别是4k,64k,1M,2M,8M和128M个数据,对于每个数量级每种赋值方式分别测试了7次。将赋值方式由第一种改为第二种后,对于1M,2M,8M和128M数据量的测试,代码运行时间可以直接看出有所减少,但减少程度不大。比如对于128M数据量的测试,第一种赋值方式用时大概率分布在584800us---586200us之间(没有计算平均时间),第二种赋值方式用时大概率分布在582400us---584400us之间(7次测试中只有一次用时超过了584400us)。

当然了,以上只是在项目中的测试,并不严谨。

测试代码:

#include <chrono>
#include <iostream>
using namespace std;

int main() {
	int* array1 = new int[100000000];
	int* array2 = new int[100000000];
	auto start_time = std::chrono::steady_clock::now();
	for (int i = 0; i < 100000000; i++) {
		array1[i] = 1;
	}
	auto code_1_time = std::chrono::steady_clock::now();
	for (int i = 0; i < 100000000; i++) {
		*(array2 + i) = 1;
	}
	auto code_2_time = std::chrono::steady_clock::now();
	cout << "code_1_time:" << std::chrono::duration<double, std::micro>(code_1_time - start_time).count() << "us" << endl;
	cout << "code_2_time:" << std::chrono::duration<double, std::micro>(code_2_time - code_1_time).count() << "us" << endl;
	return 0;
}

说明:在我的测试环境VS 2017中,总是第一个for循环的时间比第二个for循环的执行时间要长,将两个for循环中的赋值语句调换后,也是大概率第一个for循环的时间比第二个for循环的执行时间要长,甚至for循环中没有代码时,只是进行循环,第一个for循环的时间也总比第二个for循环的时间要长。

结论:两种方式性能相近,至少在这么多重循环中,它们产生的性能差距都无法抵消系统产生的时间不均误差。盲猜是编译器将两种方式编译成了相同的指令。