Есть ли несколько функций-членов, скомпилированных для каждого объекта C ++? - PullRequest
0 голосов
/ 24 декабря 2018

Я знаю, что когда мы создаем несколько объектов данного типа класса, создается несколько копий переменных-членов.Каждый объект имеет отдельный набор переменных-членов.Работает ли это так же с функциями-членами?Если в моем классе много функций, дублируются ли функции-члены для каждого создаваемого объекта?У каждого созданного объекта есть свой собственный набор функций-членов?

class demo {
  public:
    int height;
    int width;

    void setheight(int height)
    {
        this->height = height;
    }

    void getArea() const
    {
        return height * width;
    }

    // 100 more member functions.
};

Это всего лишь гипотетический пример, подтверждающий точку зрения о компиляторе C ++.На самом деле это связано с тем, что я делаю в своем проекте.Предположим, у меня есть тип класса с несколькими переменными-членами, но с большим количеством функций-членов.Если я создам несколько объектов этого типа класса, будет ли у меня дублирование кода, при этом каждый объект будет иметь свою собственную копию функции-члена?В таком случае, было бы лучше для меня объявить функции как обычные автономные глобальные функции, которые вместо этого принимают объект в качестве параметра, чтобы избежать роста исполняемого файла?

1 Ответ

0 голосов
/ 24 декабря 2018

Это просто деталь реализации (стандарт не требует ничего особенного), но практически все методы класса реализации по сути являются синтаксическим сахаром для «обычных», свободных функций, принимающих this в качестве скрытого параметра 1 .Итак, ваша предложенная оптимизация - это то, что компилятор уже делает.

Для виртуальных методов задействовано дополнительное оборудование, так как каждый виртуальный метод обычно "стоит" один слот в виртуальной таблице класса (и всех его производных классов)., но опять же, это O (1) стоимость пространства, а не O (n) в количестве экземпляров.


  1. В некоторых реализациях также есть разница в соглашении о вызовах, например, в x86Методы VC ++ получают this в ecx вместо стека, как это было бы, если бы это была свободная функция с this в качестве первого параметра, но это не имеет значения для нашего обсуждения.
...