Как локализовать ошибку SIGSEGV?

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Re: Как локализовать ошибку SIGSEGV?

Сообщение CRobin » 27.10.2016 04:41:51

serbod писал(а):procedure(var Str: string) лучше, чем function(): string, поскольку не вызывает блокировки и сброса кеша CPU.


Можно немного подробнее об этом? Всегда считал что разница в данном примере сугубо синтаксическая. Почему это должно вызывать сброс кеша ЦП и какую блокировку вы имеете в виду?
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как локализовать ошибку SIGSEGV?

Сообщение runewalsh » 27.10.2016 05:45:50

CRobin писал(а):Можно немного подробнее об этом? Всегда считал что разница в данном примере сугубо синтаксическая.

Я тоже, но...
Код: Выделить всё
{$if fpc_fullversion < 30000} {$error} {$endif}
{$mode objfpc} {$longstrings on} {$coperators on}

type
  PAnsiRec = ^TAnsiRec;
  TAnsiRec = record
    CPAwareShit: record
      case byte of
        0: (CodePage: TSystemCodePage; ElementSize: Word);
        1: (Padding: SizeInt);
      end;
    ref: SizeInt;
    len: SizeInt;
  end;

  function StringRefCount(const s: string): SizeInt;
  begin
    if Assigned(pointer(s)) then
      result := (PAnsiRec(s) - 1)^.ref
    else
      result := -1;
  end;

  procedure VarParam(var s: string);
  begin
    repeat readln(s); until s <> '';
    writeln('refcount inside VarParam: ', StringRefCount(s));
  end;

  function ReturnAsResult: string;
  begin
    repeat readln(result); until result <> '';
    writeln('refcount inside ReturnAsResult: ', StringRefCount(result));
  end;

var
  s: string;

begin
  s := ReturnAsResult;
  writeln('refcount outside ReturnAsResult = ', StringRefCount(s));

  VarParam(s);
  writeln('refcount outside VarParam = ', StringRefCount(s));
end.

У меня выводит
Код: Выделить всё
refcount outside ReturnAsResult = 2
refcount outside VarParam = 1
, что означает, что в случае с result строка сохраняется, с атомарным увеличением счётчика ссылок, во временную переменную. Думаю, это багофича для перестраховки от случая, когда функция внутри себя обращается к той же переменной, которой присвоила (бы) результат. Так себе перестраховка: существующая в том же FPC {$OPTIMIZATION UNCERTAIN}, например, не считает зазорным изредка генерировать невалидный (точнее, неэквивалентный) код для случаев, когда указатель (в т. ч. var-параметр) ссылается на переменную.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

Пред.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20

Рейтинг@Mail.ru