Ada 中的普通整数和别名整数有什么区别?

Amb*_*ben 3 types ada

我仍然对 avar : Integer;和之间的区别感到困惑var : aliased Integer;。根据 wikibooks,“如果你想访问任何变量,你需要告诉编译器该变量需要在内存中并且不能驻留在寄存器中”。寄存器内存不也是吗?所以一直困扰我的真正问题是存储在哪里var : Integer;以及var : aliased Integer;存储在哪里。

Nik*_*sti 9

维基教科书的答案适用于大多数当前的通用计算机,其中寄存器是处理器的一部分而不是内存 (RAM) 的一部分,并且寄存器没有内存地址,因此不能通过指针或“访问值”“指向” “正如他们在 Ada 中所称的那样。

一些微控制器,例如 Intel-8051 架构,确实将寄存器映射到内存位置,并且在此类机器中,别名变量可以存储在寄存器中。但是,它必须始终存储在该寄存器中,以便它始终具有相同的地址,并且只要变量存在,指向它的所有指针都保持有效。编译器通常不想将寄存器专用于变量,因为寄存器作为临时值的工作存储更有用。

虽然 C 语言有一个“寄存器”关键字,可用于向编译器提示程序员认为将某个变量存储在某个寄存器中是有益的(通常是为了速度),但今天许多编译器忽略该关键字,并使用他们自己的分析来决定哪些变量应该保存在寄存器中以及何时保存。C 编译器通常会检测代码是否曾经使用过变量的地址(“&”运算符)并使用该信息来避免将该变量存储在寄存器中(除非非常临时)。

在 Ada 中,只要有访问值指向变量,就需要“别名”关键字的更重要原因是让编译器、人类读者和静态分析工具清楚哪些变量可以通过访问值访问。因此,对于程序员来说,唯一的区别是您不能使用 var'Access,除非“var”被标记为“aliased”。“var”的存储位置应该是编译器的业务。

Ada 编译器需要该信息的一个原因是 Ada 子程序可以在其中嵌套子程序。这些嵌套子程序可以访问包含子程序的变量(如果变量在嵌套子程序之前声明),如果变量没有被标记为别名,编译器可以通过保留变量值来更好地优化嵌套子程序的代码在某些寄存器中一段时间​​,而不必担心程序的其他部分可能会尝试通过访问值访问“幕后”变量。