Как статические переменные-члены влияют на размер объекта?
Мне интересно, как статические переменные-члены обычно реализуются на таких языках, как С++, и если их использование влияет на размер создаваемых объектов.
Я знаю, что статические члены разделяются всеми экземплярами этого класса, но как они разделяются? Если он влияет на размер объекта, будет иметь 10 статических переменных, добавляющих больше размера, чем 1?
Я спрашиваю, потому что могу думать о двух способах его реализации:
- добавление указателя на статические данные для каждого объекта, аналогичного тому, как некоторые реализации добавляют указатель на таблицу виртуальных функций
- статические данные просто ссылаются непосредственно как глобальная переменная со смещением, которое разрешается компоновщиком/загрузчиком
Ответы
Ответ 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
Статические члены решаются компилятором во время компиляции. Во многих отношениях статические переменные не отличаются от глобальных переменных под капотом. Различия заключаются только в том, как вы относитесь к ним в своем коде, о сфере видимости и о том, как и когда они инициализируются.