Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Types 什么';在Ada中,正常整数和别名整数之间的区别是什么?_Types_Ada - Fatal编程技术网

Types 什么';在Ada中,正常整数和别名整数之间的区别是什么?

Types 什么';在Ada中,正常整数和别名整数之间的区别是什么?,types,ada,Types,Ada,我仍然对var:Integer之间的区别感到困惑和var:别名整数。根据wikibooks的说法,“如果你想访问任何变量,你需要告诉编译器该变量需要在内存中,并且不能驻留在寄存器中”。内存不是也有吗?所以真正困扰我的问题是,var:Integer和var:别名整数正在存储。Wikibooks的答案对大多数当前的通用计算机有效,其中寄存器是处理器的一部分,而不是内存(RAM)的一部分,并且寄存器没有内存地址,因此无法通过指针或Ada中调用的“访问值”来“指向” 有些微控制器,如Intel-8051

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

Wikibooks的答案对大多数当前的通用计算机有效,其中寄存器是处理器的一部分,而不是内存(RAM)的一部分,并且寄存器没有内存地址,因此无法通过指针或Ada中调用的“访问值”来“指向”

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

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

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


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

不同之处在于,您可以访问别名变量,而不是普通变量。至于它们的存储位置,普通变量可以存储在编译器喜欢的任何地方;从理论上讲,位置甚至可能在执行过程中发生变化。带别名的变量必须存储在
访问有意义的地方,并且必须在变量的生命周期内保持在那里


然而,这不仅仅是你是否可以访问
。编译器可以使用此类信息进行优化,如果没有这些信息,优化是不可能的。在C语言中,所有变量都有别名,您可以使用一元“&”运算符获取指向它们的指针;在Ada中,只有标记为
别名的变量才具有别名。讨论为什么Tartan Ada(83)编译器比Tartan C编译器生成的代码更快,C的“指向一切”指针方法的负面影响是部分原因。

非常感谢!你解释得很好:)C的“register”关键字并不像你说的那么过时。当gcc与
-O0
标志一起使用时,如果程序员适当地使用
寄存器,它通常可以生成半正常的代码,但在其他情况下会生成糟糕的代码。“今天标记为安全,防止意外指针访问”