накладывать накладные расходы на экземпляры классов; следовательно, они этого не делают.

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

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

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

добавление указателя на статические данные к каждому объекту аналогично тому, как некоторые реализации добавляют указатель на таблицу виртуальных функцийстатические данные просто ссылаются прямо как глобальная переменная со смещением, разрешаемым компоновщиком / загрузчиком
 Martin York09 янв. 2011 г., 21:33
Это тот вопрос, который вы можете легко проверить сами. Просто создайте соответствующие классы и выполните sizeof (T), он скажет вам, насколько они велики.
 Robert S. Barnes09 янв. 2011 г., 21:52
@Martin York: AFAIK, в Java нет оператора sizeof.

Ответы на вопрос(2)

Решение Вопроса

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

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

9,4,2 / 3 и 7 долл. США от Стандарта,

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

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

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

 Nawaz09 янв. 2011 г., 19:58
@Nerian: сериализация также зависит от того, какие элементы вы хотите включить в сериализованный объект, а какие нет. поскольку статические члены не принадлежатэкземпляры из классов, то, скорее всего, вы тоже не хотите его сериализовать; они больше похожи на глобальные объекты, доступ к которым осуществляется с помощьюA::j, В любом случае, не верь мне мнением. Я не знаю много о сериализации. Спросите кого-нибудь, кто знает. И начать другую тему. :-)
 Vinay Pai09 янв. 2011 г., 19:55
статические переменные не являются частью самого объекта и не должны быть сериализованы как есть.
 Robert S. Barnes09 янв. 2011 г., 20:06
+1: за ссылку на ideone.com я впервые ее увидел. Очень круто!
 Nerian09 янв. 2011 г., 19:51
@ Наваз: Интересно. Поэтому, если мы хотим сериализовать A, мы не можем просто предположить, что необходимая память является результатом sizeof (A). Правильно? Как мы можем узнать реальный размер тогда?
 anatolyg09 янв. 2011 г., 20:10
@Robert Это можно сделать из определения типов POD; Стандарт тщательно гласит, что добавлениеstatic члены не могут превратить тип POD в тип не POD. И расположение памяти типа POD строго определено.

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

 Weiser09 янв. 2011 г., 19:56
Не могли бы вы добавить ссылку на справочный материал, который более подробно объясняет ваш ответ?
 Dan Breslau09 янв. 2011 г., 20:10
@ Дэвид: Я не Винай, конечно, но я не уверен, какой справочный материал решит эту проблему. Я думаю, что ответ Vinay лучше всего поддерживается тем, чтоне в спецификациях языка для C ++ и Java соответственно: ничто в определениях не предполагает, что статические переменныебыло бы накладывать накладные расходы на экземпляры классов; следовательно, они этого не делают.

Ваш ответ на вопрос