Простые переменные в Java и C++

Я видел это предложение в некоторых материалах:

«В Java простые типы данных, такие как int и char, работают так же, как и в C».

Мне интересно, на самом деле они разные в Java и C++?

В C++ простым переменным, таким как примитивы в Java, также назначается адрес памяти, поэтому эти типы-примитивы в C++ также могут иметь указатель. Однако примитивам в Java не назначается адрес памяти, как объектам.

Я прав?

Спасибо!


person user36064    schedule 03.12.2008    source источник
comment
См. stackoverflow.com/questions/564/   -  person bradtgmurray    schedule 04.12.2008


Ответы (5)


Почти.

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

Причина заключалась в обеспечении безопасности при управлении памятью.

person OscarRyz    schedule 03.12.2008

Есть несколько различий между Java и C++, когда речь идет о простых типах. Распределение памяти отличается, поскольку Java скрывает концепцию явных указателей и ссылок. Вы просто создаете простой тип и присваиваете значение. Еще одно отличие состоит в том, что Java использует стандартизированные объемы памяти для каждой простой проверки типа Простые типы Java. C++, с другой стороны, зависит от платформы, на которой он скомпилирован. Еще один момент (и я не знаю, есть ли разница или нет) заключается в том, что присваивание простым типам является потокобезопасным. Я не занимался многопоточным программированием на С++, поэтому не уверен, что это нужно учитывать.

person martinatime    schedule 03.12.2008
comment
Присвоение long или double не может быть атомарным, если только оно не volatile (и даже тогда реализация, вероятно, сломана). Изменение не обязательно автоматически становится видимым для других потоков (если только оно снова не изменчиво). Операции типа ++ не атомарны — используйте AtomicInteger и др. - person Tom Hawtin - tackline; 04.12.2008

Для большинства основных вещей они работают одинаково, но есть масса различий в деталях.

  • В Java нет числовых типов без знака (кроме char, который технически, но не семантически числовой)
  • «Примитивные типы» Java могут жить только в стеке (как локальные переменные) или внутри объектов в куче, но не непосредственно в куче.
  • Тип char сильно отличается — в C он определяется как содержащий один байт (байт может иметь или не иметь 8 бит), тогда как в Java он определяется как 16-битный.
person Michael Borgwardt    schedule 05.12.2008

Верный.

В java вы не можете передать ссылку (указатель) на примитивный тип. //На самом деле в Java нет такой вещи, как указатели.

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

По ссылке передаются только объекты.

Также примитивные типы размещаются в стеке, а объекты — в куче.

person Umang Desai    schedule 08.07.2012

Примитивы хранятся в стеке и передаются по значению.

int x = 5;
int y = x;

y++;

// y = 6
// x = 5

Объекты хранятся в куче и передаются по ссылке.

Object a = new Object();
Object b = a;

b.someAction();

// A and B point to the same object and both have had the 'someAction()' performed

Я понятия не имею, об этом ли вы спрашиваете, но мне скучно, и я хочу опубликовать кое-что

person Richard Walton    schedule 03.12.2008
comment
У вас нет этого задом наперёд? Я думал, что примитивы размещены в стеке. - person bradtgmurray; 04.12.2008
comment
Объекты не передаются по ссылке. Ссылки на объекты передаются по значению. См. stackoverflow.com/questions/333151. Кроме того, примитивы хранятся в стеке только в том случае, если они являются локальными переменными. - person Jon Skeet; 04.12.2008
comment
У вас есть ссылка на объект, а не на сам объект. И из ссылки вы получаете значение ( ссылки ) :-/ Недавно у нас была жаркая дискуссия по этому поводу. stackoverflow.com/questions/333151. По ссылке может быть разное значение в зависимости от вашего фона. - person OscarRyz; 04.12.2008
comment
Оскар: Проклятые гонки комментариев ;) (Я бы сказал, что ссылка на самом деле имеет только одно подлинное значение, но иногда неправильно используется теми, кто не имеет опыта работы с CS.) - person Jon Skeet; 04.12.2008
comment
хе хе хе @Jon: Вы бы поспорили, но это не так. А без CS все равно значит другая... предыстория :) - person OscarRyz; 04.12.2008
comment
Но альтернативного, четко определенного и общепринятого значения ссылки не существует. Есть просто злоупотребление им/непонимание. Если бы группа людей думала, что int в Java 16-битный, а не 32-битный, было бы это просто альтернативной точкой зрения? Нет, это просто неправильно. - person Jon Skeet; 04.12.2008
comment
@martinatime: Хороший звонок. Оскар, прошу прощения за враждебность. Это одна из моих кнопок - я терминологический педант. Я считаю, что правильное использование терминологии невероятно важно для эффективного общения, поэтому я остановился на одном из них. Однако это все еще было невежливо. Я приношу извинения. - person Jon Skeet; 04.12.2008
comment
@matinatime: Но, но... он начал! (шучу) @Jon Skeet: Не проблема. Я тоже был таким, пока моя жена не сказала мне... Ну, это другая история. Извинения приняты. Мне тоже жаль. - person OscarRyz; 04.12.2008