Вопрос даже шире, чем я думал.
Вот объявление модуля Strings:
Код:
DEFINITION Strings;
CONST
charCode = -1; decimal = 10; hexadecimal = -2; roman = -3;
digitspace = 8FX;
hideBase = FALSE; showBase = TRUE;
PROCEDURE Valid (IN s: ARRAY OF CHAR): BOOLEAN;
PROCEDURE Extract (s: ARRAY OF CHAR; pos, len: INTEGER; OUT res: ARRAY OF CHAR);
PROCEDURE Find (IN s: ARRAY OF CHAR; IN pat: ARRAY OF CHAR; start: INTEGER;
OUT pos: INTEGER);
PROCEDURE Replace (VAR s: ARRAY OF CHAR; pos, len: INTEGER; IN rep: ARRAY OF CHAR);
PROCEDURE Lower (ch: CHAR): CHAR;
PROCEDURE Upper (ch: CHAR): CHAR;
PROCEDURE ToLower (in: ARRAY OF CHAR; OUT out: ARRAY OF CHAR);
PROCEDURE ToUpper (in: ARRAY OF CHAR; OUT out: ARRAY OF CHAR);
PROCEDURE IntToString (x: LONGINT; OUT s: ARRAY OF CHAR);
PROCEDURE IntToStringForm (x: LONGINT; form, minWidth: INTEGER; fillCh: CHAR;
showBase: BOOLEAN; OUT s: ARRAY OF CHAR);
PROCEDURE RealToString (x: REAL; OUT s: ARRAY OF CHAR);
PROCEDURE RealToStringForm (x: REAL; precision, minW, expW: INTEGER; fillCh: CHAR;
OUT s: ARRAY OF CHAR);
PROCEDURE StringToInt (IN s: ARRAY OF CHAR; OUT x, res: INTEGER);
PROCEDURE StringToLInt (IN s: ARRAY OF CHAR; OUT x: LONGINT; res: INTEGER);
PROCEDURE StringToReal (IN s: ARRAY OF CHAR; OUT x: REAL; OUT res: INTEGER);
END Strings.
Рассмотрим процедуру PROCEDURE Extract (s: ARRAY OF CHAR; pos, len: INTEGER; OUT res: ARRAY OF CHAR);
Первый параметр входит по значению, а результат выходит по ссылке.
При этом первый параметр используется только для чтения, а внутри процедуры происходит копирование элементов с pos по min(pos+len, размер(s)).
Выходит, что первый параметр был зря передан по значению, можно было бы его передавать по ссылке и ускорить работу функции Extract.
Ах, нашел ответ в описании самого модуля:
Цитата:
The library is optimized for convenience, not for efficiency.