Предположим, что я скомпилировал файл исходного файла, который содержит этот фрагмент кода,
struct Point
{
int x;
int y;
};
struct Size
{
int x;
int y;
};
Поскольку Point
и Size
точно такие же (с точки зрения структуры памяти его членов), будет ликомпилятор генерирует повторяющийся код (по одному для каждого struct
) в объектном файле?Это мой первый вопрос.
Теперь давайте удалим 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;
Будет ли эта ситуация лучше, поскольку теперь мы используем тот же экземплярный класс в typedefs?
PS: этот код шаблона класса взят здесь:
Как создать производные классы из базового класса с помощью шаблонного программирования на C ++?
На самом деле, я понятия не имею, как компилятор генерирует объектный файл из исходного кода, и как он обрабатывает имена классов, их членов, другие символы и все.Как это обрабатывает typedefs?Что это делает с этим,
typedef int ArrayInt[100];
Тип ArrayInt
новый здесь?Какой компилятор кода создает для него в объектном файле?Где хранится 100
?