Расположение упаковки и байт, как описано в C FAQ здесь :
Это для выравнивания. Многие процессоры не могут получить доступ к 2- и 4-байтным количествам (например, ints и long ints), если они переполнены каждым способом.
Предположим, что у вас есть эта структура:
struct { char a[3]; short int b; long int c; char d[3]; };
Теперь вы можете подумать, что это возможно, чтобы упаковать эту структуру в память следующим образом:
+-------+-------+-------+-------+ | a | b | +-------+-------+-------+-------+ | b | c | +-------+-------+-------+-------+ | c | d | +-------+-------+-------+-------+
Но на процессоре намного проще, если компилятор упорядочивает его как это:
+-------+-------+-------+ | a | +-------+-------+-------+ | b | +-------+-------+-------+-------+ | c | +-------+-------+-------+-------+ | d | +-------+-------+-------+
В упакованной версии обратите внимание на то, что вам и мне, как минимум, немного сложно понять, как обтекают поля b и c? В двух словах, это тоже сложно для процессора. Поэтому большинство компиляторов будут заполнять структуру (как будто с дополнительными невидимыми полями) следующим образом:
blockquote>+-------+-------+-------+-------+ | a | pad1 | +-------+-------+-------+-------+ | b | pad2 | +-------+-------+-------+-------+ | c | +-------+-------+-------+-------+ | d | pad3 | +-------+-------+-------+-------+
Я попытался бы думать об этом этот путь:
Вы идете для независимых сервисов, работающих друг под другом, и к тем сервисам могут получить доступ не-JAVA-приложения некоторое время в будущем? Затем пойдите для веб-сервисов.
Вы просто хотите распространиться, части приложения (возражайте против исключительного) по нескольким серверам? Затем пойдите для RMI, и Вы не должны будете оставлять вселенную Java для получения всего сотрудничающего сильно связанный.
мой выбор:
стандартная сериализация Java - профессионалы: по моему скромному мнению, предлагает большую часть производительности, простой реализовать (я использую Spring для представления локального интерфейса как удаленного); недостатки: сериализация не работает между различными jvm версиями
двоичная сериализация (например, гессиан от причала) - профессионалы: то же представление в качестве с сериализацией Java и работами между различными jvm версиями
WS: только если существует потребность в совместимости между различными платформами Java + .NET, иначе это просто также haveweight.
RMI является большим транспортом быстрой разработки, но я отговорил бы от использования его в продуктивной среде. Проблема совместимости сериализации может сделать вещи неловкими, необходимо скоординировать развертывание очень тщательно.
WebServices неэффективны, да, но только через аппаратные средства в нем. С другой стороны, используйте плоскость, легкий XML-HTTP, а не полный жир SOAP/WSDL.
Я выбрал бы WS.
И... Я, скорее всего, выбрал бы сервисы REST.
Если Вы не Собираетесь Потребность Это (interop с не-Java), и Вы, вероятно, не, RMI будет лучше; меньше кода, меньше конфигурации, меньше пропускной способности наверху.
Опция, если Вы боитесь, что Вы Собираетесь Потребность, Она должна использовать EJB3; это использует RMI, очень легко установить и развернуться, но также и позволяет Вам превращать свои вызовы в веб-сервисы легко при необходимости в них.
Независимо от того, что Вы делаете, не создавайте свою собственную вещь; придерживайтесь стандарта.