Как именно статические поля внутри? [дубликат]


этот вопрос уже есть ответ здесь:

  • Java: где статические поля живут в памяти? 5 ответов

скажем, у вас есть класс

class Foo
{
    public static bar;
}

когда вы говорите:

new Foo();

Я могу себе представить, что в памяти, пространство зарезервировано для данного объекта.

...и когда ты говоришь и снова:

new Foo(); 

...Ну теперь у вас есть еще места для объекта.

однако, где именно живет статическое поле?

то, что я действительно пытаюсь узнать это:

как ссылки на объекты ссылаются на одно и то же поле объектов, на которые они ссылаются?

11 55

11 ответов:

в то время как точные детали системы типов зависят от реализации, позвольте мне перейти к более подробной информации, чем просто заявить, что зависит и вам должно быть все равно. Я опишу, как это примерно работает в реализации Microsoft (.NET) в соответствии с книгой CLR через C# Джеффри Рихтер и статьи смотрите, как среда CLR создает объекты среды выполнения by Hanu Kommalapati et al. (оригинал MSDN май 2005 года выпуска).


скажем, у вас есть класс:

class Foo
{
    // Instance fields
    string myBar = "Foobar";
    int myNum;

    // Static fields
    static string bar = "Foobar";
    static int num;
}

Foo myFoo = new Foo();
Type typeOfFoo = typeof(Foo);

где живут поля экземпляра?

всякий раз, когда вы говорите new Foo() пространство выделяется и инициализируется для экземпляра объекта, и вызывается конструктор. Этот экземпляр отображается как экземпляр Foo на рисунке ниже. Например, экземпляр содержит только поля экземпляра класса (в данном случае myBar и myNum), а для объектов, выделенных в куче два дополнительных поля, используемых средой выполнения (Sync block index и Type handle). Дескриптор типа является указателем на Type объект, описывающий тип экземпляра, в данном случае тип Foo.

когда вы говорите new Foo() опять же, выделяется новое пространство, которое снова будет содержать пространство для полей экземпляра типа. Как вы можете видеть, поля экземпляра связаны с объектом экземпляров.

в среда выполнения помещает каждое поле экземпляра с фиксированным смещением от начала данных объекта. Например, myBar может жить в смещении +4. Адрес Поля экземпляра-это просто адрес объекта плюс смещение поля.

где живут статические поля?

статические поля в C# и Java связаны не с каким-либо экземпляром объекта, а с типом. Классы, структуры и перечисления, являются примерами типов. Только один раз (для каждого типа) есть некоторые пространство, выделенное для хранения значений статических полей. Было бы разумно выделить место для статических полей в Type структура, которая описывает тип, так как там тоже только один Type объект для каждого типа. Это подход, используемый C# и Java.

The Type объект1 создается, когда тип загружается во время выполнения. Эта структура содержит все виды информации, необходимой для выполнения, чтобы иметь возможность выделять новые экземпляры, вызывать методы и выполнять кастинг, между прочим. Он также содержит пространство для статических полей, в данном случае bar и num.

среда выполнения поместила каждое статическое поле с некоторым смещением от начала данных типа. Это отличается для каждого типа. Например, bar может жить на смещение + 64. Адрес статического поля-это адрес

Это полностью зависит от реализации в вопрос. Для C# и Java среда выполнения позволяет определить, где хранить память для переменной. Для C и большинство компилируемых языков программирования, компилятор делает это определение.

Как говорится, на практике,не важно. Использование его определяется спецификацией, поэтому вы можете использовать переменную, зная, что поведение будет гарантировано.

Это сильно варьируется от языка к языку, и даже может сильно варьироваться от платформы к платформе...

например, на стороне .NET статические члены "связаны" с управляющим EEClass определение можете быть в куче или выделенный член" wherever " (спецификация C# не определяет поведение кучи/стека, это деталь реализации виртуальной машины)

для Java объекты, на которые ссылаются статические поля, будут находиться в куче как и другие объекты:

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

поле будет инициализировано (если объявление содержит инициализацию), когда класс загружается, что происходит непосредственно перед первым появлением любого из следующих:

  • создается экземпляр класса.
  • вызывается статический метод, объявленный классом.
  • статическое поле, объявленное в классе.
  • используется статическое поле, объявленное классом, и это поле не является постоянной переменной (§4.12.4).

доступ к статическому полю осуществляется с помощью 2 специальных инструкций JVM,getstatic и putstatic. Но помимо этого это различие, статические поля похожи на нестатические поля.

могут быть исключения, но для ссылочных типов new-ключевое слово обычно создает объект во внутренней структуре данных, называемой "куча". Куча управляется средой CLR (Общеязыковая среда выполнения). Не имеет значения, есть ли у вас статический или экземпляр члена или локальная переменная.

разница между статическими членами и членами экземпляра (без ключевого слова static) означает, что статические члены существуют только один раз для каждого типа (класса, структуры) и экземпляра члены существуют один раз на экземпляр (на объект).

это только ссылка, которая является статической или нет; это различие не применяется к объекту ссылки (если объект не является типом значения). Статический элемент, элемент экземпляра и локальная переменная могут ссылаться на один и тот же объект.

Я знаком только с C#, и это мое понимание этого:

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

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

статические переменные принадлежат классу, а не объекту, поэтому есть только один bar в памяти, даже если вы инициализации тысячи мгновений Foo.

Это зависит от языка к языку или дизайнер языке. Если я говорю о Java, статические члены хранятся в области метода JVM, и все объекты связаны с ними. Еще одна вещь, которую очень важно знать, это то, что мы можем получить доступ к статическому члену данных без создания объекта class.It означает, что выделение памяти для статических элементов данных не зависит от создания объекта этого класса.

по спецификации статические переменные хранятся в Постоянный Бассейн. JVM хранит эту информацию в постоянном поколении.

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

Так что в основном это как

+++++++++++++++++++++++++++++++++++++
+ DATA Segment
+   -static vars
+   
+----------------------------------
+  instances | instances | instances|
+            |           |          |

здесь одна область разделяется между экземплярами.

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