__thread Foo foo;
“foo”如何实际解决?编译器是否以函数调用静默替换“foo”的每个实例? “foo”存储在相对于堆栈底部的某处,并且编译器将其存储为“嘿,对于每个线程,将此空间放在堆栈底部附近,并将foo存储为'堆栈底部的偏移x' “?
答案 0 :(得分:33)
这有点复杂(this document非常详细地解释了它),但它基本上都没有。而是编译器在可执行文件中放置一个特殊的.tdata部分,其中包含所有线程局部变量。在运行时,使用(只读).tdata部分中的数据副本创建每个线程的新数据部分,并且在运行时切换线程时,该部分也会自动切换。
最终结果是__thread变量和常规变量一样快,并且它们也不会占用额外的堆栈空间。