Прямые буферы в Java инициализируются значением по умолчанию, таким как массивы? - PullRequest
11 голосов
/ 03 июля 2011

Когда я инициализирую массив в Java, например:

float[] array = new float[1000];

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

FloatBuffer buffer = ByteBuffer.allocateDirect(4*1000).asFloatBuffer();

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

Ответы [ 4 ]

4 голосов
/ 03 июля 2011

Похоже, что ответ вероятно .

Глядя на реализацию ByteBuffer, он использует DirectByteBuffer под капотом. Взглянув на реализацию исходного кода Android, он имеет такой комментарий:

Создает новый прямой байтовый буфер данная мощность на вновь выделенных Операционная память. Память будет обнуляется.

Итак, когда вы выделяете буфер, все содержимое памяти будет инициализировано нулем. Реализация oracle также выполняет обнуление.

Это деталь реализации, хотя. Поскольку Javadoc ничего не говорит об обнулении, технически некорректно полагаться на него. Чтобы быть правильным, вы должны действительно обнулить буфер самостоятельно. На практике, если вы по какой-то причине действительно беспокоитесь о производительности, вы можете не обращать на это внимания, но имейте в виду, что некоторые реализации JVM могут не выполнять обнуление.

3 голосов
/ 03 марта 2016

Глядя на Javadoc для Java 7 , а также Java 8

, теперь написано

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

не определено, поэтому вам больше не нужно обнулять их самостоятельно.

3 голосов
/ 03 июля 2011

От дукментации до родительского абстрактного класса Buffer:

Начальное содержимое буфера, как правило, undefined .

В отсутствие чего-либо обратного я бы предположил, что это относится к буферам, выделенным ByteBuffer.allocateDirect (). Интересно, что я предполагаю, что это строго относится и к обычным буферам на основе массива, хотя при выделении массива Java подразумевается, что массив будет обнуляться.

0 голосов
/ 04 июля 2011

Невозможно сказать, поэтому вопрос бесполезен. Начальная позиция равна нулю, поэтому не существует API, который вы можете запустить, который вернет часть буфера, в который еще не был 'помещен'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...