我讀FastMM4的源代碼,並發現了這個有趣的功能GetThreadID組裝
function GetThreadID: Cardinal;
{$ifdef 32Bit}
asm
mov eax, FS:[$24]
end;
{$else}
begin
Result := GetCurrentThreadID;
end;
{$endif}
我測試過它,和它的作品,所以我的問題是,爲什麼它的工作原理任何解釋?
我讀FastMM4的源代碼,並發現了這個有趣的功能GetThreadID組裝
function GetThreadID: Cardinal;
{$ifdef 32Bit}
asm
mov eax, FS:[$24]
end;
{$else}
begin
Result := GetCurrentThreadID;
end;
{$endif}
我測試過它,和它的作品,所以我的問題是,爲什麼它的工作原理任何解釋?
x86的寄存器FS指向Thread Information Block Windows中的信息。地址FS + 0x24處的TIB中的值包含當前線程的ID。通過將該值移至用於傳遞函數返回值的eax,GetThreadID返回當前線程ID。
所以,這意味着我可以使用FS + 0x20來返回進程ID。這必須比Windows單元中定義的效率更高。 – 2013-04-23 16:17:18
它可能稍微更高效,但我在這裏告訴你,提取PID和TID不是程序中的瓶頸。 – 2013-04-23 17:30:23
@David,從OP讀其他帖子,我不認爲OP有瓶頸。他更喜歡極端的優化......也許:) – kobik 2013-04-23 19:04:32
此方法使用存儲在Thread Environment Block
關於TEB的另一個[必須看到鏈接](http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Thread/TEB.html)。 [MS文檔](http://msdn.microsoft.com/library/windows/desktop/ms686708)對此主題沒有用處。 – OnTheFly 2013-04-23 16:12:39
相反,MS文檔非常好。由於這是私人實施,所以私人實施細節的正確文檔策略是保持私密性。 – 2013-04-23 20:04:04
@DoctorLai,我很好奇,你爲什麼稱**閱讀記憶與**魔術**流離失所「有效」? – OnTheFly 2013-04-23 20:04:24