0

次のような構造体が定義されている場合:

struct blank {
    int : 0;
};

コンパイラはこれを実行時にゼロに最適化しますか?

このかなり人気のあるSOの質問のために私は尋ねます。自分のC/C++コードでも同様のコンパイル時チェックを採用したいと思います。プログラムを可能な限り最適化しようとしているので、コンパイル時のチェックにのみ使用する場合は、これらの空の構造体を実行時にぶら下げたくありません。

ちなみに、リンクと同じ結果を達成するためのC ++の慣用的な方法はありますか?

4

3 に答える 3

5

C ++では、オブジェクトが基本クラスを実装している場合にのみ、その最適化が許可されます。(したがって、空ベース最適化またはEBOと呼ばれます。)スタンドアロンのオブジェクト、または別のメンバーとしてのオブジェクトのstruct場合、そのバイトが単にパディングされている場合でも、少なくとも1バイトの大きさである必要があります。

リンクされた質問のような構成については、心配しないでください。そこにはオブジェクトはなく、タイプだけがあります。オブジェクトがあったとしても、リンカーによって削除されます。特にすべてをエクスポートするように要求しない限り、参照されていない関数とグローバルオブジェクトは実行可能ファイルに入りません。その場合でも、保持する名前が必要になる可能性があります。

他の人が述べているように、それを行うC++11の方法はですstatic_assert。エラーメッセージが必要です:

static_assert( condition, "Error: condition was false." );
于 2013-02-22T00:41:20.857 に答える
2

依存します。as-ifルールにより、この構造体のすべてのインスタンスを完全に排除できる場合、コンパイラーはその最適化を実行できます。コンパイラーがそれを行うかどうかは、それがどのコンパイラーであるか、そして場合によってはオプティマイザーの設定に依存します。

実際には、モジュールの境界を越えてインスタンスのアドレスを渡すことstructは、少なくとも1バイトのサイズのRAMでインスタンスを具体化するかなり確実な方法です(プログラム全体のオプティマイザーがそれをキャッチしない限り)。したがって、これを別のまたはstructのメンバーのタイプとして使用しています。structclass

于 2013-02-22T00:34:32.460 に答える
2

空の構造体は独自のアドレスを持つことが保証されていますが、それだけです。構築に時間を費やすことはありません(結局のところ、空です。構築するものは何もありません)。

同じことを行うC++の慣用的な方法は、static_assert(C ++ 11標準に準拠したコンパイラーで使用可能)を使用することです。

于 2013-02-22T00:40:55.550 に答える