这有点复杂(本文档对此进行了详细说明),但实际上两者都不是。而是,编译器在可执行文件中放置一个特殊的.tdata节,其中包含所有线程局部变量。在运行时,将为每个线程创建一个新的数据段,并在(只读).tdata节中创建数据副本,并且在运行时切换线程时,该节也会自动切换。
最终结果是__thread变量与常规变量一样快,并且它们也不占用额外的堆栈空间。

这有点复杂(本文档对此进行了详细说明),但实际上两者都不是。而是,编译器在可执行文件中放置一个特殊的.tdata节,其中包含所有线程局部变量。在运行时,将为每个线程创建一个新的数据段,并在(只读).tdata节中创建数据副本,并且在运行时切换线程时,该节也会自动切换。
最终结果是__thread变量与常规变量一样快,并且它们也不占用额外的堆栈空间。