Размер структуры больше, чем сумма ее частей из-за того, что называется упаковкой. У конкретного процессора есть предпочтительный размер данных, с которым он работает. Большинство современных процессоров предпочитают размер, если 32 бит (4 байта). Доступ к памяти, когда данные находятся на этом типе границы, более эффективен, чем те, которые охватывают эту границу размера.
Например. Рассмотрим простую структуру:
struct myStruct
{
int a;
char b;
int c;
} data;
Если машина является 32-разрядной машиной, а данные выровнены по 32-битной границе, мы видим немедленную проблему (при отсутствии выравнивания структуры). В этом примере предположим, что данные структуры начинаются с адреса 1024 (0x400 - обратите внимание, что младшие 2 бита равны нулю, поэтому данные выравниваются с 32-разрядной границей). Доступ к data.a будет работать нормально, потому что он начинается на границе - 0x400. Доступ к data.b также будет работать нормально, поскольку он находится по адресу 0x404 - еще одна 32-разрядная граница. Но неуравновешенная структура поставит data.c по адресу 0x405. 4 байта данных.c находятся в 0x405, 0x406, 0x407, 0x408. На 32-битной машине система считывала data.c в течение одного цикла памяти, но получала бы только 3 из 4 байтов (четвертый байт находится на следующей границе). Таким образом, системе потребуется второй доступ к памяти для получения 4-го байта,
Теперь, если вместо того, чтобы поместить data.c по адресу 0x405, компилятор заполнил структуру на 3 байта и поместил данные. c по адресу 0x408, тогда системе потребуется всего 1 цикл, чтобы прочитать данные, сократив время доступа к этому элементу данных на 50%. Заполняет эффективность памяти для эффективности обработки. Учитывая, что компьютеры могут иметь огромные объемы памяти (много гигабайт), компиляторы считают, что своп (скорость над размером) является разумным.
К сожалению, эта проблема становится убийцей при попытке отправить структуры по сети или даже записать двоичные данные в двоичный файл. Прокладка, вставленная между элементами структуры или класса, может нарушить данные, отправленные в файл или сеть. Чтобы написать переносимый код (тот, который будет использоваться для нескольких разных компиляторов), вам, вероятно, придется обращаться к каждому элементу структуры отдельно, чтобы обеспечить надлежащую «упаковку».
С другой стороны, разные компиляторы имеют разные возможности для управления упаковкой структуры данных. Например, в Visual C / C ++ компилятор поддерживает команду #pragma pack. Это позволит вам настроить упаковку и выравнивание данных.
Например:
#pragma pack 1
struct MyStruct
{
int a;
char b;
int c;
short d;
} myData;
I = sizeof(myData);
Теперь я должен иметь длину 11. Без прагмы я мог бы быть чем угодно из 11 до 14 (а для некоторых систем - до 32), в зависимости от стандартной упаковки компилятора.
Вы, кажется, работаете главным образом с Java и/или Ruby, поэтому простите мне, что этот ответ основан на Perl :-).
Я очень люблю Катализатор Платформа MVC (http://www.catalystframework.org/). Это делегирует фактическое отображение запросов (в общем, универсальном смысле) для кодирования через механизмы. Предоставленный, все классы механизма в настоящее время основаны на HTTP, но я играл с идеей попытаться записать класс механизма, который не был основан на HTTP (или был, возможно, связан с чем-то как Твиттер, но был разделен от взаимодействий HTTP, которые Твиттер использует). По крайней мере я убежден, что это может быть сделано, даже если я еще не нашел время для попытки его.
Я не видел тот. Проблема - то, что запрос также связывается с хостом, и ответ связывается с запросом.
Таким образом, если бы Вы получаете запрос на пути электронная почта, и контроллер говорит для рендеринга представления "aboutus", Вам была бы нужна платформа MVC, чтобы знать как к:
Веб-платформа MVC не собирается сокращать его - Вам будет нужен MVC "хост", который может обработать активацию через сеть, SMS, электронную почту, безотносительно.
Спецификация Сервлета Java была разработана, чтобы Сервлеты были нейтральным протоколом, и быть расширенными в особенном методе протокола - HttpServlet, являющийся определенным для протокола расширением Сервлета. Я всегда предполагал, что Sun или другая треть poarty поставщики платформы, придумает другие определенные для протокола расширения как FtpServlet или MailServlet, или в этом случае SmsServlet и TwitterServlet.
Вместо этого то, что произошло, - то, что люди или полностью обошли платформу Сервлета или создали их протоколы сверху HTTP.
Конечно, если бы Вы хотите реализовать определенное для протокола расширение для своих требуемых протоколов, необходимо было бы разработать целый стек - объект запроса, объект ответа, механизм идентификации сессий (например, использующий MSISDN в SMS вместо cookie), шаблонная обработка и рендеринг платформы (эквивалентный из JSP) - и затем создать платформу MVC сверху его.
Вы могли реализовать основанный на REST Адаптер по своему веб-сайту, который заменяет шаблоны и перенаправления согласно входным параметрам.
Все запросы, входящие на api.yourhost.com, будут обработаны остальными базирующийся адаптер.
Этот адаптер позволил бы называть Ваш веб-сайт программно и иметь результат в parseable формате.
Практически это означает: Это заменяет Шаблоны собственным Движком шаблонов, на котором это вещи происходят:
затем можно сделать Poller Твиттера, Шлюз SMS или даже назвать его из JavaScript.