コード例を次に示します。
enum Foo // or enum class whatever
{ BAR
, STUFF
};
inline const char* to_string( const Foo& foo )
{
static const char* const NAMES[] =
{ "BAR"
, "STUFF"
};
// let's assume I have some boundary checks here, it's not the point
return NAMES[foo];
};
この関数はインラインで、いくつかのコンパイル ユニットで使用されるヘッダーにあります。ここでの目標は、この関数が使用されない場合、コンパイラが何もしないようにすることです。
質問:
- C++ 標準は、NAMES が 1 つのオブジェクト ファイルにのみ存在することを保証しますか?それとも、すべてのオブジェクト ファイルにそのコピーがあることを決定するのはコンパイラに任されていますか?
- 複数のコピーがある場合、それはリンクの問題になりますか (それを確認するのに十分なコンパイラをテストできないと思います)。
- gcc、msvc、clang はすべて、最終的なバイナリに NAMES のインスタンスを 1 つだけ持たせることで、このケースを最適化しますか?