Используя структуру C в Java

Мне нравится Orion Adrian ответ, но существует другой аспект к нему.

тот же вопрос был несколько изложенных десятилетия назад об ассемблере по сравнению с "человеческими" языками как ФОРТРАН. И часть ответа подобна.

Да, программа C++ способна к тому, чтобы быть быстрее, чем C# на ком-либо данном (нетривиальный?) алгоритм, но программа в C# часто будет столь же быстрым или быстрее, чем "наивная" реализация в C++, и оптимизированная версия в C++ займет больше времени для разработки и могла бы все еще разбить версию C# очень маленьким полем. Так, это действительно стоит того?

необходимо будет ответить на тот вопрос на один за другим основание.

Тем не менее я - долговременный поклонник C++, и я думаю, что это - невероятно выразительный и мощный язык - иногда недооцениваемый. Но во многих "реальных" проблемах (мне лично, который имеет в виду "вид, который мне платят для решения"), C# сделает задание раньше и более безопасный.

самый большой штраф Вы платите? Многие.NET и программы Java являются пожирателями ресурсов памяти. Я видел.NET, и приложения Java берут "сотни" мегабайтов памяти, когда программы C++ подобной сложности едва царапают "десятки" MBS.

13
задан Rohin 17 August 2009 в 13:17
поделиться

5 ответов

Swig выполнит за вас много утомительной повторяющейся работы с точки зрения отображения структур C на объекты Java. Ознакомьтесь с руководством Swig / Java и статьей о обертке структур C .

4
ответ дан 1 December 2019 в 21:53
поделиться

Существует библиотека Preon, которая была разработана, чтобы помочь вам с этим типом задач: Preon site По сути, они стараются сохранить всю логику для чтения ваших pojo из двоичного потока в аннотациях, привязанных к каждому полю в вашем pojo.

Пример из их документации, где вы контролируете размер читаемого int:

class Rectangle
{
  @BoundNumber(size="16") private int x1;
  @BoundNumber(size="16") private int y1;
  @BoundNumber(size="16") private int x2;
  @BoundNumber(size="16") private int y2;
}

или для указания порядка байтов:

class Rectangle
{
  @BoundNumber(byteOrder=LittleEndian) private int x1;
  @BoundNumber(byteOrder=LittleEndian) private int y1;
  @BoundNumber(byteOrder=LittleEndian) private int x2;  
  @BoundNumber(byteOrder=LittleEndian) private int y2;
}

You могут даже использовать мини-уравнения со ссылками на значения в предыдущих полях для определения размера / длины и т. д.

@BoundList(size="width * height") byte[] pixels;
@BoundNumber(size="nrBits * 2") int value;

Да, и они также предлагают условную логику, все в аннотациях.

8
ответ дан 1 December 2019 в 21:53
поделиться

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

5
ответ дан 1 December 2019 в 21:53
поделиться

java.nio имеет ByteBuffer, который поддерживает изменение порядка байтов при чтении и записи, при необходимости "на лету".

2
ответ дан 1 December 2019 в 21:53
поделиться

Есть несколько библиотек, которые помогают в этой области. Один из самых простых в использовании (драйвер аннотаций) - это, конечно, Preon

5
ответ дан 1 December 2019 в 21:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: