Другое важное различие между Java и C / C ++ состоит в том, что ссылки являются индексом объекта. Тогда как в C / C ++ указатель является адресом в памяти.
В 32-разрядной JVM это одно и то же, однако в 64-разрядной JVM это не так. Вы заметите, что это различие заключается в том, что для размеров кучи менее 32 ГБ ссылки по-прежнему 32-разрядные (даже в 64-разрядной JVM). Это связано с тем, что объекты размещаются на 8-байтовой границе, поэтому индекс может ссылаться на до 32 ГБ памяти (4 ГБ * 8 байт)
В 64-битных программах на C / C ++ указатель должен иметь возможность ссылаться на каждый байт, даже если выделение памяти находится на границе 16 байт, и поэтому он имеет размер 64 бита (технически это должно быть возможно сделать 32-битная память менее 4 ГБ.)
A интеллектуальный указатель требуется два базовых указателя (всего 16 байт), но на gcc минимальный размер выделения для счетчика ссылок составляет 32 байта (и тогда у вас есть размер объекта, который вы указать на) Общий размер составляет 32 байта + 16 байтов на указатель. c.f. 4 байта на ссылку в Java. (8 байт, если у вас 32+ ГБ кучи)
Таким образом, ссылка на Java не обязательно должна быть реальным адресом или даже иметь такой же размер, как указатель. Это, конечно, намного меньше, чем умный указатель.