示例代碼的結果奇怪的行爲:有記錄的功能
unit Main;
interface
uses
Winapi.Windows, System.SysUtils, Vcl.Forms;
type
TSomeRec = record
SomeData: Integer;
SomePtr: Pointer;
procedure Reset;
class operator Implicit(const SomeData: Integer): TSomeRec;
end;
TMainForm = class(TForm)
procedure FormCreate(Sender: TObject);
private
FSomeRec: TSomeRec;
end;
var
MainForm: TMainForm;
GSomeRec: TSomeRec;
implementation
{$R *.dfm}
function SomeFunc(Value: Integer): TSomeRec;
begin
OutputDebugString(PWideChar(Result.SomeData.ToString + ' : ' + Integer(Result.SomePtr).ToString));
Result.SomeData := Value;
end;
{ TSomeRec }
procedure TSomeRec.Reset;
begin
SomeData := 5;
SomePtr := nil;
end;
class operator TSomeRec.Implicit(const SomeData: Integer): TSomeRec;
begin
OutputDebugString(PWideChar(Result.SomeData.ToString + ' : ' + Integer(Result.SomePtr).ToString));
Result.SomeData := SomeData;
end;
{ TMainForm }
procedure TMainForm.FormCreate(Sender: TObject);
var
LSomeRec: TSomeRec;
begin
LSomeRec.Reset;
GSomeRec.Reset;
FSomeRec.Reset;
LSomeRec := 1;
GSomeRec := 1;
FSomeRec := 1;
LSomeRec.Reset;
GSomeRec.Reset;
FSomeRec.Reset;
LSomeRec := SomeFunc(1);
GSomeRec := SomeFunc(1);
FSomeRec := SomeFunc(1);
end;
end.
此代碼給這個調試輸出:
Debug Output: 5 : 0 Process DPITest.exe (1764)
Debug Output: 172555996 : 1638080 Process DPITest.exe (1764)
Debug Output: 1 : 1638080 Process DPITest.exe (1764)
Debug Output: 5 : 0 Process DPITest.exe (1764)
Debug Output: 1 : 1638080 Process DPITest.exe (1764)
Debug Output: 1 : 1638080 Process DPITest.exe (1764)
看來,編譯器爲不同的變量建立不同代碼:
- LSomeRec他們通過作爲var參數(作爲expecte d)。
- 對於GSomeRec和FSomeRec編譯器,創建臨時變量,在爲正常變量賦值後傳遞她。
這是正常的嗎?如果是正常的,請給我鏈接到規範(文檔)。
PS
添加少量...
Here上寫着:
對於靜態數組,記錄,並設置結果,如果值佔用一個字節 它在AL中返回;如果該值佔用兩個字節,則在AX中返回 ;如果該值佔用4個字節,則返回EAX中的 。否則,結果被傳遞給函數的聲明參數
但事實上,這條規則是不成立後,一個額外的變量參數 返回。如果它包含調試器輸出如下:
Debug Output: 5 : 0 Process DPITest.exe (1764)
Debug Output: 5 : 0 Process DPITest.exe (1764)
Debug Output: 5 : 0 Process DPITest.exe (1764)
Debug Output: 5 : 0 Process DPITest.exe (1764)
Debug Output: 5 : 0 Process DPITest.exe (1764)
Debug Output: 5 : 0 Process DPITest.exe (1764)
我不認爲這是重複的 - 返回值被初始化是答案的一部分,但我認爲OP期望隱式類操作符的行爲與它的行爲不同。具體來說,他們似乎預計'result'會預先加載左側變量的記錄內容(即:操作員將提供零碎分配/替換的目標記錄)。這根本不是那麼回事。 –
我沒有把它寫進去,而且我也沒有看到作爲一個笨蛋關閉它有什麼不好。我們積極鼓勵這樣做。每個人都可以建立這些鏈接。我看不出有什麼比返回值沒有被初始化更多的東西。 –
@Vasek您的重置方法需要麻煩。變異值的值類型的方法往往會造成混淆。傾向於使用簡單的常量賦值。 –