gpt4 book ai didi

ada - 为 Ada Array of Records 循环生成什么代码?

转载 作者:行者123 更新时间:2023-12-03 18:14:28 26 4
gpt4 key购买 nike

例如对于:

type PERSONCV is
record
name: String ( 1..4 );
age: Integer;
cvtext: String ( 1..2000 );
end record;

N: constant := 40000;
persons : array ( 1..N ) of PERSONCV;

function jobcandidate return Boolean is
iscandidate: Boolean := False;
begin
for p of persons loop -- what code is generated for this?
if p.age >= 18 then
iscandidate := true;
exit;
end if;
end loop;
return iscandidate;
end;

在 C/C++ 中,循环部分通常是:
PERSONCV * p; // address pointer
int k = 0;
while ( k < N )
{
p = &persons [ k ]; // pointer to k'th record
if ( p->age >= 18 )...
...
k++ ;
}

我读过 Ada 对记录使用值语义。
上面的 Ada 循环是否将第 k 条记录复制到循环变量 p?
例如像这样在 C/C++ 中:
PERSONCV p; // object/variable
int k = 0;
while ( k < N )
{
memcpy ( &p, &persons [ k ], sizeof ( PERSONCV ) ); // copies k'th elem
if ( p.age >= 18 )...
...
k++ ;
}

最佳答案

假设您使用 GNAT,有两种调查途径。

开关-gnatG将重新生成类似 Ada 的表示,表示编译器的前端将传递给后端的内容(在任何优化之前)。在这种情况下,我看到

   function resander__jobcandidate return boolean is
iscandidate : boolean := false;
L_1 : label
begin
L_1 : for C8b in 1 .. 40000 loop
p : resander__personcv renames resander__persons (C8b);
if p.age >= 18 then
iscandidate := true;
exit;
end if;
end loop L_1;
return iscandidate;
end resander__jobcandidate;

所以问题是,如何 renames得到翻译?鉴于记录大小为 2008 字节,编译器生成副本的机会几乎为零。

第二种调查方法是使用开关 -S 保留编译器通常发送给汇编器然后删除的汇编代码。 .这确认生成的代码类似于您的第一个 C++ 版本(适用于 macOS)。

作为一个有趣的旁白,Ada 2012 允许替代实现 jobcandidate :
   function jobcandidate2 return Boolean is
(for some p of persons => p.age >= 18);

生成相同的代码。

关于ada - 为 Ada Array of Records 循环生成什么代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41746244/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com