Подтвердить что ты не робот

Как статические переменные-члены влияют на размер объекта?

Мне интересно, как статические переменные-члены обычно реализуются на таких языках, как С++, и если их использование влияет на размер создаваемых объектов.

Я знаю, что статические члены разделяются всеми экземплярами этого класса, но как они разделяются? Если он влияет на размер объекта, будет иметь 10 статических переменных, добавляющих больше размера, чем 1?

Я спрашиваю, потому что могу думать о двух способах его реализации:

  • добавление указателя на статические данные для каждого объекта, аналогичного тому, как некоторые реализации добавляют указатель на таблицу виртуальных функций
  • статические данные просто ссылаются непосредственно как глобальная переменная со смещением, которое разрешается компоновщиком/загрузчиком
4b9b3361

Ответ 1

В С++ статические члены не относятся к экземплярам класса. они не увеличивают размер экземпляров и класса даже на 1 бит!

struct A
{
    int i;
    static int j;
};
struct B
{
    int i;
};
std::cout << (sizeof(A) == sizeof(B)) << std::endl;

Вывод:

1

То есть размер A и B точно такой же. статические члены больше похожи на глобальные объекты, доступ к которым осуществляется через A::j.

См. демонстрацию в ideone: http://www.ideone.com/YeYxe


$9.4.2/1 из Стандарта С++ (2003),

Статический член данных не является частьюподобъекты класса. Там есть только одна копия статического члена данных разделяемых всеми объектами класс.

$9.4.2/3 и 7 из Стандарта,

когда статический член данных был он существует, даже если нет объектов его класса.

Элементы статических данных инициализируются и уничтожены точно так же, как нелокальные объектов (3.6.2, 3.6.3).

Как я уже сказал, статические члены больше похожи на глобальные объекты!

Ответ 2

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