Как статические переменные-члены влияют на размер объекта? - PullRequest
12 голосов
/ 09 января 2011

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

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

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

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

Ответы [ 2 ]

25 голосов
/ 09 января 2011

В C ++ статические члены не принадлежат экземплярам класса.они не увеличивают размер экземпляров и класса даже на 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 из стандарта C ++ (2003),

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

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

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

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

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

6 голосов
/ 09 января 2011

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

...