共有ライブラリでルックアップテーブルを初期化したいのですが、これが有効な方法であるかどうかを確認したいと思います。さらに多くのライブラリで引き続き使用する場合は、これから作成します。
typedef std::map<std::string, int> NAME_LUT;
NAME_LUT g_mLUT;
namespace
{
bool OneTimeInit()
{
::g_mLUT.insert(NAME_LUT::value_type("open", 1));
::g_mLUT.insert(NAME_LUT::value_type("close", 2));
return true;
}
bool bInit = OneTimeInit(); // Just to make initialization happen
}
Visual Studioとgcc(Linux)の両方で正常に動作するようです。bInit
gccだけが、どこにも使用されていないことを訴えます。
- 初期化が最適化されている(
bInit
使用されていない)か、言語で許可されていない(副作用のため)可能性はありますか? - 確かに、1回限りの初期化を処理するための優れたクロスプラットフォームの方法のように見えますが、これが最善のアプローチであるかどうかはわかりません。
OneTimeInit
宣言を静的にすることは意味がありますか?(つまり、を使用するstatic bool OneTimeInit() {...}
)、または名前空間のみが、このコンパイルユニットに固有にするためのより良いアプローチです。