C++クラスの静的メンバーがthread_local
とメンバーテンプレートの両方である場合、初期化されません。thread_local静的メンバーテンプレートの定義:gccで初期化が失敗する
#include <unordered_map>
#include <iostream>
class A {
public:
template<typename T>
thread_local static std::unordered_map<int,T> m;
};
template<typename T>
thread_local std::unordered_map<int,T> A::m{};
int main() {
// A::m<int> = std::unordered_map<int,int>{}; // solves the problem
std::cout << A::m<int>.bucket_count() << std::endl; // returns zero.
A::m<int>.insert({1,2}); // causes SIGPFE (hash modulo bucket_count)
}
unordered_mapは初期化されておらず、バケットカウントはゼロです。これは、ハッシュがモジュロバケットカウントとされるとき、ゼロ除算につながります。 thread_local
がないか、template
がなければ正常に動作します。メンバをそれを使用するすべてのスレッドで手動で初期化する(コメント行)と、この問題を解決します。
C++標準に従ってこの未定義の動作ですか?これはコンパイラのバグでしょうか?私はgcc 7.1.1と5.2.0を試しましたが、両方ともエラーが発生します。 clang 3.8が動作するようです。
編集:私はSVNからのgcc 8.0.0 20170817で、この動作を確認し、バグレポート提出:質問を閉じるために、もう一度https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81880
はのように思える見ます私にはっきりとしたバグ。あなたは報告書を提出しましたか?あなたがした場合は、リンクを共有していただけますか? – SergeyA
gcc(HEAD)8 ...これも影響を受けます – Swift
私はそれがバグだとは思わない。あなたが作成したすべてのスレッドのデータを使用しない場合でも、そのデータを初期化するのに時間が掛からないのはなぜですか?スレッドローカルストレージは、コンパイラではなくOSによって処理されます。 –