Мне нравится Orion Adrian ответ, но существует другой аспект к нему.
тот же вопрос был несколько изложенных десятилетия назад об ассемблере по сравнению с "человеческими" языками как ФОРТРАН. И часть ответа подобна.
Да, программа C++ способна к тому, чтобы быть быстрее, чем C# на ком-либо данном (нетривиальный?) алгоритм, но программа в C# часто будет столь же быстрым или быстрее, чем "наивная" реализация в C++, и оптимизированная версия в C++ займет больше времени для разработки и могла бы все еще разбить версию C# очень маленьким полем. Так, это действительно стоит того?
необходимо будет ответить на тот вопрос на один за другим основание.
Тем не менее я - долговременный поклонник C++, и я думаю, что это - невероятно выразительный и мощный язык - иногда недооцениваемый. Но во многих "реальных" проблемах (мне лично, который имеет в виду "вид, который мне платят для решения"), C# сделает задание раньше и более безопасный.
самый большой штраф Вы платите? Многие.NET и программы Java являются пожирателями ресурсов памяти. Я видел.NET, и приложения Java берут "сотни" мегабайтов памяти, когда программы C++ подобной сложности едва царапают "десятки" MBS.
Swig выполнит за вас много утомительной повторяющейся работы с точки зрения отображения структур C на объекты Java. Ознакомьтесь с руководством Swig / Java и статьей о обертке структур C .
Существует библиотека 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;
Да, и они также предлагают условную логику, все в аннотациях.
Вы можете использовать DataInputStream
для загрузки данных из любого InputStream
. Если вы знаете точный макет своих структур, этого должно быть достаточно.
java.nio имеет ByteBuffer, который поддерживает изменение порядка байтов при чтении и записи, при необходимости "на лету".
Есть несколько библиотек, которые помогают в этой области. Один из самых простых в использовании (драйвер аннотаций) - это, конечно, Preon