根据这一声明:
Trace.Debug("My String" & Integer'Image(x) & "is evaluated" & "or not" & "if my logger is disabled ?" & Boolean'Image(YesOrNo) );和这个Trace.Debug的实现
procedure Debug (Message : in String) is
begin
if Logger.Enabled then -- This boolean is defined during runtime by reading a value in a file
Put_Line(Message);
else
null; -- Do nothing
end if;
end Debug;我有一个软件,可以管理几个级别的日志,我想知道在Logger.Enabled等于False的情况下是什么行为。
我有很多日志调用,有时有复杂的字符串要计算,而且我在实时系统上,所以我不想浪费时间来计算不会打印的字符串。
我想知道编译器是否优化了代码,以便在Logger.enabled为False时不计算Trace.Debug参数中的字符串,因为知道这个布尔值是通过读取文件中的值在请求运行时设置的。
我使用的是gnat 7.3.2。
发布于 2021-11-17 12:15:25
您可以通过提供一个回调来确保评估不会发生:
procedure Debug (Message : access function return String) is
begin
if Logger.Enabled then
Put_Line(Message.all);
end if;
end Debug;然后调用它,执行
declare
function Msg return String is
("My String" & Integer'Image(x) & "is evaluated" & "or not" & "if my logger is disabled ?" & Boolean'Image(YesOrNo));
begin
Debug (Msg'Access);
end;在原始代码中,编译器跳过求值的唯一方法是内联Debug过程并重新排列代码,以便仅在if-block内部分配Message对象。您不能强制这样做;即使是pragma Inline也只是对编译器的一个提示。
https://stackoverflow.com/questions/69990093
复制相似问题