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