このコードを含むソースファイルファイルをコンパイルするとします。
struct Point
{
int x;
int y;
};
struct Size
{
int x;
int y;
};
Point
とSize
は(そのメンバーのメモリレイアウトに関して)まったく同じなので、コンパイラstruct
はオブジェクトファイルに重複コード(各に1つ)を生成しますか?それが私の最初の質問です。
それでは、ソースコードからを削除し、代わりに次のようにstruct Size
定義してみましょう。typedef
typedef Point Size;
コンパイルは今何をしますか?コードを複製しますか(typedefは名前を変更するだけでなく、それ以上のものであるため)?
ここで、次のようなクラステンプレートがあるとします。
template <int UnUsed>
class ConcreteError : public BaseError {
public:
ConcreteError () :BaseError(), error_msg() {}
ConcreteError (int errorCode, int osErrorCode, const std::string& errorMessage)
:BaseError(errorCode, osErrorCode, errorMessage){}
};
そして、このようにいくつかの定義を設定します。
typedef ConcreteError<0> FileError;
typedef ConcreteError<1> NetworkError;
typedef ConcreteError<2> DatabaseError;
テンプレートパラメータint UnUsed
はクラスの実装では使用されないため(と仮定してください)、この状況はまったく同じメモリレイアウトを持つ複数のクラスとまったく同じように見えます(との場合と同様struct Point
)struct Size
。オブジェクトファイル?
そして、私たちがこのようにしたらどうなるでしょう、
typedef ConcreteError<0> FileError;
typedef ConcreteError<0> NetworkError;
typedef ConcreteError<0> DatabaseError;
typedefで同じインスタンス化されたクラスを使用しているので、この状況はより良いですか?
PS:このクラステンプレートコードはここから取得されます:
C ++のテンプレートプログラミングを使用して基本クラスから派生クラスを作成するにはどうすればよいですか?
実際、コンパイラがソースコードからオブジェクトファイルを生成する方法や、クラス名、メンバー、その他のシンボルなどをどのように処理するのか、私にはわかりません。typedefをどのように処理しますか?これで何をしますか、
typedef int ArrayInt[100];
ArrayInt
ここに新しいタイプはありますか?オブジェクトファイルにどのコードコンパイラが作成しますか?どこに100
保管されていますか?