Понимание выравнивания слов

Вот код для Get, Set and Delete Cookie в JavaScript .

function getCookie(name) {
    name = name + "=";
    var cookies = document.cookie.split(';');
    for(var i = 0; i 

Источник: http://mycodingtricks.com/snippets/javascript/javascript-cookies/

13
задан Jordi Castilla 24 April 2015 в 08:33
поделиться

4 ответа

Оборудование сложное; это упрощенное объяснение.

Типичный современный компьютер может иметь 32-битную шину данных. Это означает, что любая выборка, которую должен выполнить ЦП, будет извлекать все 32 бита определенного адреса памяти. Поскольку шина данных не может получить ничего меньше 32 бит, два младших бита адреса даже не используются на адресной шине, поэтому создается впечатление, что ОЗУ организовано в последовательность 32-битных слов вместо 8-битных байтов .

Когда ЦП выполняет выборку для одного байта, цикл чтения на шине будет извлекать 32 бита, а затем ЦП отбрасывает 24 из этих битов, загружая оставшиеся 8 бит в любой регистр. Если ЦП хочет получить 32-битное значение, которое ​​не выровнено по 32-битной границе, у него есть несколько общих вариантов:

  • выполнить два отдельных цикла чтения на шине, чтобы загрузить соответствующие части слова данных и собрать их заново.
  • прочитать 32-битное слово по адресу, определенному отбрасыванием двух младших бит адреса
  • чтения некоторая неожиданная комбинация байтов, собранных в 32-битное слово, вероятно, не та, которую вы хотели
  • вызвать исключение

Различные процессоры, с которыми я работал, прошли все четыре этих пути. В общем, для максимальной совместимости безопаснее всего выровнять все n-битные чтения по n-битной границе. Однако вы, безусловно, можете использовать ярлыки, если уверены, что ваше программное обеспечение будет работать на каком-то конкретном семействе процессоров с известным поведением невыровненного чтения. И даже если невыровненное чтение возможно (например, на процессорах семейства x86), оно будет медленнее.

вероятно, не тот, который вы хотели
  • вызвать исключение
  • Различные процессоры, с которыми я работал, прошли все четыре этих пути. В общем, для максимальной совместимости безопаснее всего выровнять все n-битные чтения по n-битной границе. Однако вы, безусловно, можете использовать ярлыки, если уверены, что ваше программное обеспечение будет работать на каком-то конкретном семействе процессоров с известным поведением невыровненного чтения. И даже если невыровненное чтение возможно (например, на процессорах семейства x86), оно будет медленнее.

    вероятно, не тот, который вы хотели
  • вызвать исключение
  • Различные процессоры, с которыми я работал, прошли все четыре этих пути. В общем, для максимальной совместимости безопаснее всего выровнять все n-битные чтения по n-битной границе. Однако вы, безусловно, можете использовать ярлыки, если уверены, что ваше программное обеспечение будет работать на каком-то конкретном семействе процессоров с известным поведением невыровненного чтения. И даже если невыровненное чтение возможно (например, на процессорах семейства x86), оно будет медленнее.

    26
    ответ дан 1 December 2019 в 19:40
    поделиться

    Компьютер всегда считывает некоторые блоки фиксированного размера, которые выровнены.

    Таким образом, если вы не выровняете данные в памяти, вам, вероятно, придется читать более одного раза.

    Пример

    • размер слова составляет 8 байтов
    • ваша структура также 8 байтов
    • если вы выровняете ее, вам придется прочитать один кусок
    • , если вы не выровняете его, вы нужно прочитать два фрагмента

    Итак, это в основном для ускорения.

    7
    ответ дан 1 December 2019 в 19:40
    поделиться

    Try reading a serial port. The data is 8 bits wide. Nice hardware designers ensure it lies on a least significant byte of the word.

    If you have a C structure that has elements not word aligned ( from backwards compatibility or conservation of memory say ) then the address of any byte within the structure is not word aligned.

    0
    ответ дан 1 December 2019 в 19:40
    поделиться

    Причиной всех правил выравнивания является различная ширина линий кэша (Instruction-Cache имеет 16-байтовые линии для архитектуры Core2, а Data-Cache имеет 64-байтовые линии для L1 и 128-байтовые линии для L2).

    Таким образом, если вы хотите хранить/загружать данные, которые пересекают границу Cahce-Line, вам придется загружать и сохранять обе Cache-линии, что снижает производительность. Поэтому вы просто не делаете этого из-за снижения производительности, все просто.

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

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