2013-04-28 51 views
1

我知道两个变量,比如a1和a2出现在Fortran中的Equivalence(a1,a2)语句中,然后它们占据相同的内存空间。所以说这发生在一个过程中,其中a1和a2是该过程中的局部变量。Fortran中的“等价”

这意味着你不仅可以在内存中拥有a1和a2的副本吗?因为其中一个值将被覆盖。你可以将a1保留在内存位置,并将a2保存在整个过程的注册表中,这样会好吗?

我的问题基本上是:你可以在整个过程中注册a1吗?

我会说是的...除非你用尽了寄存器和A1必须存储回内存。然后你将覆盖a2并丢失它的值,然后变量a1和a2将实际指向a1的值。

回答

5

a1a2equivalence语句中表示这两个变量将占用相同的存储空间。即使它们是不同类型的变量(例如,a1是整数,a2是真实的),更改一个也会改变另一个。 Fortran并没有给你任何指定变量应该在寄存器中的方法,并且看起来极有可能是一个equivalence语句会自动禁止编译器这样做。

所以

你可以保留在存储位置A1和A2保持在寄存器 整个过程,这点会被罚款吗?

不适用。

我强烈建议不要使用equivalence ......这是有害的,可能只保留在语言中以支持遗留代码。如果您需要跨类型传输数据,则现代Fortran方法是内部函数transfer

+0

感谢您的回答。您能否从理论意义上回答这个问题,即从Fortran程序员的角度来看?我们正在编写一门关于编译器的课程,这是我们正在修改的一个问题,所以更多的是关于注册分配而不是Fortran的使用(我们根本不用Fortran编程)。 – Awoken 2013-04-29 00:32:06

+1

如果将a1和a2放入不同的地方,例如一个放在RAM中,另一个放在寄存器中,那么程序就很难像等价语句那样工作。每当一个变量的值发生变化时,编译器生成的可执行文件也必须更新其他变量。 – 2013-04-29 01:11:58

+0

只要考虑'等价性'作为记忆中某个地方的别名。可能与类型转换。 – 2013-04-29 10:38:16

2

使用equivalence的唯一原因是为同一件事物有两个名字。作为Fortran程序员,您无法控制寄存器或任何此类事物。不要考虑内存和寄存器。认为你有两个名字的“盒子”。无论您使用哪个名称,您都可以在同一个存储箱中存储或检索。