Занимают ли статические члены класса память, если объект этого класса не создан? - PullRequest
19 голосов
/ 30 января 2011

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

Ответы [ 3 ]

35 голосов
/ 30 января 2011

Нет.

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

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

8 голосов
/ 30 января 2011

Стандарт C ++ явно не указывает, когда статическая память выделяется, если она доступна при первом использовании. Тем не менее, он, скорее всего, распределяется во время инициализации программы, таким образом гарантируя его присутствие, как только это потребуется, без кода специального случая для обнаружения и выполнения выделения при доступе.

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

0 голосов
/ 30 января 2011

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

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