Typedefs, (двоичный) дублирование кода и объектный файлC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Typedefs, (двоичный) дублирование кода и объектный файл

Сообщение Anonymous »

Предположим, я скомпилировал исходный файл, содержащий этот фрагмент кода:

Код: Выделить всё

struct Point
{
int x;
int y;
};

struct Size
{
int x;
int y;
};
Поскольку Point и Size абсолютно одинаковы (с точки зрения расположения их элементов в памяти), будет ли компилятор генерировать дубликат кода (один для каждая структура) в объектном файле? Это мой первый вопрос.



Теперь давайте удалим структуру Size из исходного кода и вместо этого определите его, используя typedef, вот так:

Код: Выделить всё

typedef Point Size;
Что теперь будет делать компиляция? Будет ли это дублировать код (поскольку typedef — это не просто переименование, а нечто большее)?



Теперь предположим, что мы есть такой шаблон класса:

Код: Выделить всё

template 
class ConcreteError : public BaseError {
public:
ConcreteError () :BaseError(), error_msg() {}

ConcreteError (int errorCode, int osErrorCode, const std::string& errorMessage)
:BaseError(errorCode, osErrorCode, errorMessage){}
};
А затем мы устанавливаем несколько определений, вот так:

Код: Выделить всё

typedef ConcreteError FileError;
typedef ConcreteError NetworkError;
typedef ConcreteError DatabaseError;
Поскольку параметр шаблона int UnUsed не используется в реализации класса (просто предположим это), то кажется, что эта ситуация точно такая же, как и у Multiple классы, имеющие точно такое же расположение памяти (аналогично случаю struct Point и struct Size), будет ли дублированный код в объектном файле?

А что, если мы сделаем вот так,

Код: Выделить всё

typedef ConcreteError FileError;
typedef ConcreteError NetworkError;
typedef ConcreteError DatabaseError;
Ситуация лучше, поскольку теперь мы используем тот же экземпляр класса в определениях типов?

PS: код шаблона этого класса взят отсюда:

Как создать производные классы из базового класса с помощью программирования шаблонов на C++?



Вообще-то, я понятия не имею, как компилятор генерирует объектный файл из исходного кода и как он обрабатывает имена классов, их члены, другие символы и все такое. Как он обрабатывает определения типов? Что он с этим делает,

Код: Выделить всё

typedef int ArrayInt[100];
Является ли здесь ArrayInt новым типом? Какой код компилятор создает для него в объектном файле? Где хранится 100?

Подробнее здесь: https://stackoverflow.com/questions/447 ... bject-file
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»