Статические члены класса занимают память, если объект этого класса не создается?
Скажем, у меня есть класс, и у меня есть статический член, но я не создаю никаких объектов такого типа. Будет ли память занята для статической переменной? Если он будет занят, в чем смысл положить его в класс?
Ответы
Ответ 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
.
Смотрите демонстрацию на идеоне: http://www.ideone.com/YeYxe
$9.4.2/1 из Стандарта С++ (2003),
Статический член данных не является частью подобъекты класса. Там есть только одна копия статического элемента данных разделяемых всеми объектами класс.
$9.4.2/3 и 7 из Стандарта,
, когда статический член данных был он существует, даже если нет объектов его класса.
Элементы статических данных инициализируются и уничтожены точно так же, как нелокальные объектов (3.6.2, 3.6.3).
Как я уже сказал, статические члены больше похожи на глобальные объекты!
Ответ 2
В стандарте С++ явно не указано, когда выделена статическая память, если она доступна при первом использовании. Тем не менее, это скорее всего выделено во время инициализации программы, что гарантирует его присутствие, как только это потребуется, без необходимости использования специального кода для обнаружения и выполнения распределения при доступе.
Назначение статических данных в класс такое же, как помещение любых других данных в классы. Помещая данные в структуру классов, вы определяете инкапсулирующее пространство имен, а также возможность контролировать доступ с использованием методов доступа и мутаторов; это, в свою очередь, позволит вам проверять данные, поступающие в хранилище статической памяти, и обеспечивать согласованность во время использования этих данных.
Ответ 3
Статические переменные хранятся в специальной области памяти под названием BSS, а экземпляры класса хранятся в куче или в стеке. Таким образом, статические элементы хранятся отдельно.