【发布时间】:2018-06-12 09:37:52
【问题描述】:
我在 Ada 中有一个包含矩阵的类。我想实现一个将其作为constant access 类型返回的函数,只是为了能够将其作为只读值获取,但避免不必要的复制。
我已经通过返回对 Integer 的引用进行了尝试,仅用于测试目的:
package Tests_Package is
type B is private;
function Test(Self : in B) return access constant Integer;
private
type B is tagged
record
I : aliased Integer;
end record;
end Tests_Package;
-------------------------------------------
package body Tests_Package is
function Test(Self : in B) return access constant Integer is
begin
return Self.I'access;
end Test;
end Tests_Package;
上面不会编译,错误是:non-local pointer cannot point to local object.
我的问题是:
为什么我会得到这个错误?
有什么方法可以实现我想要的,而不使用Unchecked_Access?
我是否真的需要返回变量的引用,或者副本可以由 Ada 编译器优化出来?
【问题讨论】:
-
副本可以优化掉。除非您确实无法满足预先指定的定量计时要求,否则您不必担心。
-
在这种特殊情况下,函数的
Self参数是按值传递的。这意味着编译器creates是所传递值的本地副本。当函数返回时,这个本地副本不再存在;因此,返回的地址无效。要使其正常工作,您可以将此值作为access(在 C/C++ 中也称为指针)传递。