1

Как эти разные типы методов обрабатываются в памяти.Статические методы и методы экземпляра в памяти

я нашел два различных объяснения этого:

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

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

Какой способ используется различными компиляторами?

+0

Все компиляторы используют (2) – 2010-02-05 09:05:46

+0

Метод №2 звучит гораздо логичнее, чем # 1. – Dor

+0

@Neil, конечно, все? Как вы можете быть так уверены? –

ответ

2

Короткий ответ, как сказал Йоханнес, почти всегда # 2. Оба будут существовать только в памяти в одном месте, но методы экземпляра имеют контекст (который в основном является дополнительным скрытым аргументом), который дает им доступ к экземпляру.

Но: Некоторые языки/среды будут создавать экземпляр функции, которая выглядит (с наивным чтением исходного кода), как одна функция несколько раз. Хорошим примером этого является JavaScript: объект функции закрывается над областью, в которой он определен, поэтому, если имеется несколько областей (например, вызываемая функция более одного раза), возникает несколько различных объектов функции. (Интерпретаторы/JIT-ERS может оптимизировать ли дублирует код, но концептуально это и ссылки функции отличаются.)

Вот пример в JavaScript:

function foo() { 

    alert("hi there"); 
} 

function buildBar(x) { 

    function bar() { 
     alert(x); 
    } 

    return bar; 
} 

var f1, f2; 

f1 = foo; 
f2 = foo; 
f1(); 
// alerts "hi there" 
f2(); 
// alerts "hi there" 
alert("f1 === f2 ? " + (f1 === f2)); 
// alerts "true", there is only one `foo` 

var b1, b2; 

b1 = buildBar("one"); 
b2 = buildBar("two"); 
b1(); 
// alerts "one" 
b2(); 
// alerts "two" 
alert("b1 === b2 ? " + (b1 === b2)); 
// alerts "false", there are two `bar`s 

Это становится актуальным в некоторых реализациях данных «частного» экземпляра в JavaScript, где люди определяют методы экземпляра внутри конструктора (так как buildBar определяет bar), поэтому они имеют доступ к закрытым переменным, объявленным в конструкторе. Это имеет желаемый эффект (данные частного экземпляра), но влияние нескольких экземпляров функции - по одному для каждого экземпляра объекта.

1

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

Что такое существует несколько раз в памяти (по крайней мере для .NET) - это общие классы и их соответствующие конкретные применения. Если вы используете как List<int>, так и List<string>, тогда вы получите две JIT-копии кода, одну для int, одну для string.

0

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

Для не виртуальных методов ссылки могут быть определены во время компиляции.

Смежные вопросы