Разрушает ли компилятор классы, которые идентичны по своей структуре? - PullRequest
4 голосов
/ 02 марта 2011

Надеюсь, это не дубликат самого вопроса, но условия поиска настолько неоднозначны, что я не могу придумать ничего лучшего.

В любом случае, скажем, у нас есть два класса:

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

и где-то еще

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

С практической точки зрения они одинаковы, так что компилятор рассматривает их обоих как своего рода typedef? Или он выдаст две отдельные единицы кода?

Мне любопытно, потому что я хотел бы выйти за пределы typedefs и сделать несколько вариантов типа для улучшения читабельности. Я не хочу ненужного дублирования, хотя ...

Ура! * * 1013

Ответы [ 6 ]

2 голосов
/ 02 марта 2011

Это полностью зависит от реализации.

Например, я могу использовать CLang / LLVM, чтобы проиллюстрировать обе точки зрения одновременно:

  • CLang - это интерфейс C ++, он использует два разных типа для разрешения вызовов функций и т. Д. И обрабатывает их как совершенно разные значения
  • LLVM - это бэкэнд оптимизатора, он не заботится (пока) об именах, а только о структурном представлении и поэтому свернет их в один тип ... или даже полностью удалит определение времени, если оно бесполезно.

Если вопрос заключается в следующем: действительно ли введение подобного класса создает накладные расходы, тогда ответом будет no , поэтому напишите классы, которые вам нужны.

Примечание: то же самое происходит с функциями, то есть оптимизатор может объединять блоки функций, которые идентичны, для получения более точного кода, но это не причина для копирования / вставки, хотя

2 голосов
/ 02 марта 2011

Это, конечно, очень сильно зависит от реализации.

Любой внутренний коллапс здесь будет полностью внутренним по отношению к механизму компилятора и не будет влиять на создаваемый переведенный код.

Я полагаю, что это очень маловероятно, так как я не могу представить себе никакой выгоды и нескольких способов, которыми это действительно усложнит ситуацию. Я не могу представить никаких доказательств.

2 голосов
/ 02 марта 2011

Поскольку классы, которые вы используете в качестве примеров, актуальны только во время компиляции, дублировать или сворачивать нечего. Во время выполнения к переменным-элементам просто обращаются как к «значению по смещению N».

2 голосов
/ 02 марта 2011

Это совершенно не связанные классы по отношению к компилятору.

Если они являются просто C-структурами POD, они фактически не будут генерировать для них никакого реального кода. (Да, есть оператор тихого присваивания и некоторые другие функции, но я сомневаюсь, что для этого будет фактически скомпилирован код, он просто встроит их, если они будут использованы).

1 голос
/ 02 марта 2011

Нет, они не обрабатываются как typedef, потому что они разных типов и могут, например, использоваться для перегрузки функций.

С другой стороны, в типах нет кода, поэтому дублировать нечего.

1 голос
/ 02 марта 2011

Нет.Как они буквально два разных типа.Компилятор должен относиться к ним таким образом.Волшебное слияние не происходит.

...