2015-06-06 5 views
2

Данный класс Line как в Java и C++, а также следующие объявления в Java и C++ соответственно -распределение памяти - Java против C++

Line[] p; 

и

Line *p; 

Каковы различия в семантике между на двух языках при последующем запуске следующего кода:

p = new Line[7]; 

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

Извините, что я провел исследование по этому вопросу, однако я все еще чувствую, что не понял.

Спасибо!

ответ

1

Когда массивы объявлены в Java, они хранятся в виде массива ссылок. Вы не столкнулись бы с этой накладной стоимостью при инициализации массива класса Line в C++, потому что ваш массив будет удерживать объекты, а не только их ссылки.

+2

Это становится важным при распределении многомерных массивов. В то время как C++ выделяет все размеры как один большой кусок памяти, Java рассеивает субмассивы. Для массива 10x10 из 'int', для примера Java выделяет 10 массивов размера '10 * размера int + a little' плюс один массив размера' 10 * размера ссылки + немного', C++ выделяет только один массив размера '100 * размера int. «A little» требуется в Java для получения дополнительной информации: размер массива, тип, ... – Turing85

+0

Да, отличная точка и точно правильный Turing85! : O) Прикрепление 2-D выделения памяти для C++ (http://www.fredosaurus.com/notes-cpp/arrayptr/23two-dim-array-memory-layout.html) и Java (http: // www. javamex.com/tutorials/memory/array_memory_usage.shtml) для OP –

+0

@ user3636636 В приведенном выше коде будет создан массив из семи ссылок. Эти ссылки будут установлены на «null». Вы можете проверить, что путем итерации по массиву и печати записей после 'новой строки [7];'. Оба массива (в C++ и Java) инициализируются с помощью 'null', поскольку ни C++, ни Java не знают, как инициализировать строку. Ситуация отличается от встроенных ('int',' long', ...), поскольку они имеют значения по умолчанию для propper. Furhtermore, C++ использует массивы «на месте»: массивы хранят записи direclty, тогда как java-массив «only» сохраняет ссылку на объект. – Turing85

3

Вы сравниваете код Java и C++, который не эквивалентен. Следующий C++ является эквивалентом кода Java (массив ссылок):

Line **p; 
p = new Line*[7]; 

версия C++ вы писали:

Line *p; 
p = new Line[7]; 

является массивом объектов и инициализирует каждый элемент массива, используя конструктор по умолчанию «Линия» (попробуйте его с явным конструктором с 1 параметром, и вы увидите, что C++ сообщает вам, что вам нужен конструктор по умолчанию). Java не имеет эквивалента этому способу создания массивов не-примитивных типов, которые получают каждый элемент по умолчанию - в Java все элементы массива не-примитивного типа являются «null», пока вы явно не назначите их).

0

Как было сказано выше, код equivilant C++ фактически

Line **p; 
p = new Line*[7]; 

поскольку Java выделить массив ссылок, а не массив одноранговых объектов.

В C++ оператору new гарантируется выделение памяти из кучи. В Java - это зависит. обычно ключевое слово new выделяет память из кучи, но некоторые компиляторы, такие как HotSpot, заготовят так называемый «анализ побега»: если компилятор обнаруживает, что указатель не возвращается из функции или не идет в другую нить - он может объявить объект в стеке (эквивалентно Line p[7] C++)

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