C++ 这两种访问阵列的方法实现是否相同?

C++ 这两种访问阵列的方法实现是否相同?,c++,arrays,pointers,compiler-construction,implementation,C++,Arrays,Pointers,Compiler Construction,Implementation,我们有一个三字节数组,如下所示: char charArray[3]; charArray[1]='a'; //or char * charP=charArray; charP[1]='a'; 两个方法用于访问数组的第二个元素,现在编译器将以相同的方式实现它们,还是第一个方法将不涉及类似指针的第二个方法?从语义上讲,它们的行为相同-将设置第二个元素-但未指定编译器将如何实现这一点 编译器可能会选择将第一个数组访问实现为带有偏移量的指针引用,并对第二个数组执行相同的操作。另一方面,它可能会优化本

我们有一个三字节数组,如下所示:

char charArray[3];
charArray[1]='a';
//or
char * charP=charArray;
charP[1]='a';

两个方法用于访问数组的第二个元素,现在编译器将以相同的方式实现它们,还是第一个方法将不涉及类似指针的第二个方法?

从语义上讲,它们的行为相同-将设置第二个元素-但未指定编译器将如何实现这一点

编译器可能会选择将第一个数组访问实现为带有偏移量的指针引用,并对第二个数组执行相同的操作。另一方面,它可能会优化本地分配的阵列访问并直接引用适当的内存位置——同样,它可能会对第二次访问进行相同的优化,但可能不会。它的选项取决于编译的二进制平台,以及它是否“意识到”数组或指针实际上指向局部变量(您希望它指向)


因为无论如何你都不能区分,<强>通常可以认为它们是相同的<强>,即使实现发生了不同。

语义上,它们的行为是相同的——第二个元素将被设置,但是它没有指定编译器将如何实现这一点。 编译器可能会选择将第一个数组访问实现为带有偏移量的指针引用,并对第二个数组执行相同的操作。另一方面,它可能会优化本地分配的阵列访问并直接引用适当的内存位置——同样,它可能会对第二次访问进行相同的优化,但可能不会。它的选项取决于编译的二进制平台,以及它是否“意识到”数组或指针实际上指向局部变量(您希望它指向)

因为无论如何你都不能区分,<强>通常可以认为它们是相同的<强>,即使实现发生了不同。

编译器会以同样的方式实现它们吗

也许吧

如果使用数组的名称,并且下标是常量表达式,编译器可能会在编译时执行部分或全部指针运算。它可能无法使用指向数组的指针执行相同的操作;这可能取决于编译器是否能够确定指针指向数组中的元素

不过,这只是猜测。确定给定编译器是否为这两个编译器发出相同代码的唯一方法是查看该编译器发出的代码

编译器会以同样的方式实现它们吗

也许吧

如果使用数组的名称,并且下标是常量表达式,编译器可能会在编译时执行部分或全部指针运算。它可能无法使用指向数组的指针执行相同的操作;这可能取决于编译器是否能够确定指针指向数组中的元素


不过,这只是猜测。确定给定编译器是否为两者发出相同代码的唯一方法是查看该编译器发出的代码。

第二种方法可能会使编译器生成更多代码。charP是一个指针,它需要一个变量,尽管少量代码可能会对编译器进行优化


使用charP时,它是一个l值,您可以将它移动到另一个位置,然后使用++等增加它。

第二种方法可能会使编译器生成更多代码。charP是一个指针,它需要一个变量,尽管少量代码可能会对编译器进行优化

使用charP时,它是一个l值,您可以将它移动到另一个位置,并使用++等增加它。

查看

检查编译器以不同优化级别生成的汇编代码。我保证你会通过这种方式学到很多东西。

看看吧


检查编译器以不同优化级别生成的汇编代码。我保证这样你会学到很多东西。

+1。。。吹毛求疵:“你的编译器”发出的代码没有告诉任何关于“给定的编译器”发出的内容…;-)@克莱斯特:哈。哎呀。谢谢。。。吹毛求疵:“你的编译器”发出的代码没有告诉任何关于“给定的编译器”发出的内容…;-)@克莱斯特:哈。哎呀。谢谢。编译一下,看看反汇编的代码。ASM写起来可能很痛苦,但读起来并不难。(这只会给你一个非结论性的或确定的否定答案)编译它,并查看反汇编代码。ASM写起来可能很痛苦,但读起来并不难。(这只会给你一个非决定性或决定性的答案。)