4

これが質問自体の重複ではないことを願っていますが、検索用語が非常にあいまいであるため、これ以上のことは考えられません。

とにかく、2つのクラスがあるとしましょう:

class FloatRect
{
 float x,y,width,height;
};

そしてどこか他の場所

class FloatBox
{
 float top,left,bottom,right;
};

実用的な観点からは、それらは同じですが、コンパイラは両方をある種のtypedefとして扱いますか?それとも、2つの別々のコードユニットを生成しますか?

typedefを超えて、読みやすさを向上させるために型のいくつかのバリアントを作成したいので、興味があります。でも、不必要な複製はしたくない…

乾杯!

4

6 に答える 6

2

これは完全に実装固有です。

たとえば、CLang / LLVMを使用して、両方の観点を同時に説明できます。

  • CLangはC++フロントエンドであり、関数呼び出しなどを解決するために2つの異なるタイプを使用し、それらを完全に異なる値として扱います。
  • LLVMはオプティマイザーバックエンドであり、名前は(まだ)気にせず、構造表現のみを気にするため、単一のタイプに折りたたむか、役に立たない場合は時間定義を完全に削除します。

質問が次の場合:同様にレイアウトされたクラスを導入するとオーバーヘッドが発生しますが、答えはノーです。必要なクラスを記述してください。

注:関数についても同じことが起こります。つまり、オプティマイザーは同一の関数のブロックをマージして、より厳密なコードを取得できますが、これはコピー/貼り付けの理由ではありません。

于 2011-03-02T18:07:44.827 に答える
2

これらは、コンパイラに関してはまったく関係のないクラスです。

それらが単なるPODC構造体である場合、実際にはそれらの実際のコードは生成されません。(はい、サイレント代入演算子と他のいくつかの関数がありますが、それを行うために実際にコンパイルされたコードがあるとは思えません。それらが使用されている場合は、それらをインライン化するだけです)。

于 2011-03-02T17:21:02.633 に答える
2

サンプルとして使用するクラスはコンパイル中にのみ関連するため、複製したり折りたたんだりすることはありません。実行時、メンバー変数は単に「オフセットNの値」としてアクセスされます。

于 2011-03-02T17:21:03.473 に答える
2

もちろん、これは実装固有のものです。

ここでの内部崩壊は、コンパイラのメカニズムの完全な内部であり、生成された翻訳済みコードには影響しません。

メリットがなく、これが問題を本当に複雑にするいくつかの方法を考えることができるので、これが当てはまる可能性は非常に低いと思います。しかし、私は証拠を提示することはできません。

于 2011-03-02T17:21:30.353 に答える
1

いいえ。文字通り2つの異なるタイプです。コンパイラはそれらをそのように扱う必要があります。魔法の融合は起こっていません。

于 2011-03-02T17:20:52.103 に答える
1

いいえ、それらは異なるタイプであり、たとえば関数のオーバーロードに使用できるため、typedefとしては扱われません。

一方、型にはコードが含まれていないため、重複するものはありません。

于 2011-03-02T17:27:45.500 に答える