我们有一个三字节数组,如下所示:
char charArray[3];
charArray[1]='a';
//or
char * charP=charArray;
charP[1]='a';
两个方法用于访问数组的第二个元素,现在编译器会以相同的方式实现它们还是第一个方法不会像第二个方法那样涉及指针?
编译器会以同样的方式实现它们吗
也许吧。
如果使用数组的名称并且下标是常量表达式,则编译器可能可以在编译时执行部分或全部指针运算。 使用指向数组的指针可能无法执行相同的操作;这可能取决于编译器是否可以确定指针指向数组中的元素。
但这只是猜测。 确定给定编译器是否为两者发出相同代码的唯一方法是查看该编译器发出的代码。
第二种方法可能会让编译器生成更多的代码。 charP 是一个指针,需要一个变量,尽管使用少量代码可能会进行编译器优化。
对于 charP,它是一个左值,您可以将其移动到指向另一个位置,并且可以使用 ++ 等递增它。
从语义上讲,它们的行为相同 - 第二个元素将被设置 - 但没有指定编译器如何实现这一点。
编译器可能会选择将第一个数组访问实现为带有偏移量的指针引用,并对第二个数组执行相同的操作。 另一方面,它可能会优化本地分配的数组访问并直接引用适当的内存位置 - 同样,它可能会对第二次访问进行相同的优化,但也可能不会。 它具有的选项取决于正在编译的二进制平台,以及它是否“意识到”数组或指针实际上指向局部变量(您希望它指向局部变量)。
既然你无论如何都无法区分差异,你通常可以认为它们是相同的,即使实现恰好不同。
看一看!
检查编译器使用不同优化级别生成的汇编代码。我保证你会通过这种方式学到很多东西。