2010-11-17 71 views
1

我们有一个三字节数组象下面这样:访问数组的这两种方法是否实现相同?

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

两种方法用于访问到阵列的第二元件,现在将它们以相同的方式通过编译器或第一种方法实现将不涉及一个像第二种方法的指针?

+0

编译一下,看看反汇编的代码。 ASM可能是一种痛苦的写作,但它并不难以阅读。 (OTOH,只会给你一个不确定的或明确的答案。) – BCS 2010-11-17 17:57:12

回答

4

他们将被以同样的方式通过编译器

可能实现。

如果使用数组名,下标是常量表达式,编译器可以做很可能部分或全部在编译时指针运算。使用指向数组的指针可能无法做到这一点;这可能取决于编译器是否可以确定指针指向数组中的元素。

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

+0

+1 ... Nitpick:“你的编译器”发出的代码没有告诉任何“给定的编译器”发出什么...... ;-) – Kleist 2010-11-17 15:51:30

+0

@Kleist:哈。哎呀。谢谢。 – 2010-11-17 15:52:46

1

语义上讲,它们会表现一样 - 第二个元素将被设置 - 但它没有指定为以编译器将如何实现这一目标。

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

因为你不能分辨无论如何,通常可以考虑他们是相同的,即使执行情况不同。

1

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

与CHARP,它是一个L值,你可以将它指向另一个位置,你可以用++增加它,等

0

来看看吧!

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

相关问题