Startdard 单例类实现生成对 TLS 内存的访问

逆向工程 视窗 C++
2021-06-19 21:31:42

我检查了 Windows 中使用静态变量的基本单例实现的程序集输出,以使用来自静态函数的新类实例进行初始化。

令我惊讶的是,虽然该类具有进程范围的范围,但内部实现使用对 TLS 的访问。

myClass::getInstance()
{
    static v = new myClass();
    return v; 
}

和汇编输出(第一个相关行):

push    rdi
sub     rsp, 40h
mov     rdi, rsp
mov     ecx, 10h
mov     eax, 0CCCCCCCCh
rep stosd
mov     [rsp+48h+var_18], 0FFFFFFFFFFFFFFFEh
mov     eax, 4
mov     eax, eax
mov     ecx, cs:_tls_index
mov     rdx, gs:58h
mov     rcx, [rdx+rcx*8]

也许任何人都可以提供一些关于为什么需要这样做的见解(也许是性能)?

谢谢

1个回答

它是由线程安全的本地静态初始化功能生成的。

线程安全的静态局部变量在内部使用线程局部存储 (TLS) 来在静态已经初始化时提供高效的执行。

请参阅此处了解原始提案。