36
__thread Foo foo;

「foo」は実際にどのように解決されますか? コンパイラは "foo" のすべてのインスタンスを暗黙のうちに関数呼び出しに置き換えますか? 「foo」はスタックの下部に相対的な場所に保存され、コンパイラはこれを「ねえ、各スレッドについて、スタックの下部近くにこのスペースを確保し、foo は「スタックの下部からのオフセット x」として保存されます。 "?

4

1 に答える 1

45

少し複雑ですが (このドキュメントで詳しく説明しています)、基本的にはどちらでもありません。代わりに、コンパイラは、すべてのスレッド ローカル変数を含む特別な .tdata セクションを実行可能ファイルに配置します。実行時に、スレッドごとに新しいデータ セクションが作成され、(読み取り専用) .tdata セクション内のデータのコピーが作成されます。実行時にスレッドが切り替えられると、セクションも自動的に切り替えられます。

その結果、__thread 変数は通常の変数と同じくらい高速であり、余分なスタック スペースも占有しません。

于 2010-03-17T03:35:10.843 に答える