Цель выравнивания памяти

Код не запускается / что-то похожее на части моего PHP-кода выводятся

Если вы не видите никакого результата из вашего кода PHP и / или видите части своего литерального исходного кода PHP на веб-странице вы можете быть уверены, что ваш PHP на самом деле не выполняется. Если вы используете View Source в своем браузере, вы, вероятно, видите весь исходный код PHP-файла. Поскольку PHP-код встроен в теги , браузер попытается интерпретировать их как HTML-теги, и результат может выглядеть несколько смущенным.

Чтобы на самом деле запустить ваши PHP-скрипты, вам нужно:

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

* Если вы не переконфигурируете его, все может быть настроено.

Это последнее особенно важно. Двойной щелчок по файлу, скорее всего, откроет его в вашем браузере, используя такой адрес, как:

file://C:/path/to/my/file.php

Это полностью обходит любой веб-сервер, который у вас может быть запущен, и файл не интерпретируется. Вам нужно посетить URL-адрес файла на вашем веб-сервере, вероятно, что-то вроде:

http://localhost/my/file.php

Вы также можете проверить, используете ли вы короткие открытые теги вместо и ваша PHP-конфигурация отключила короткие открытые теги.

Также см. PHP-код не выполняется, вместо этого код отображается на странице

175
задан Dan Hook 20 November 2009 в 20:02
поделиться

4 ответа

Это - ограничение многих базовых процессоров. Это может обычно работаться вокруг путем выполнения 4 неэффективных единственных выборок байта, а не одной эффективной выборки слова, но много спецификаторов языка решили, что будет легче только запретить их и вынудить все быть выровненное.

существует намного больше информации в эта ссылка , который обнаружил OP.

57
ответ дан Paul Tomblin 23 November 2019 в 20:26
поделиться

Подсистема памяти на современном процессоре ограничивается доступом к памяти при гранулярности и выравнивании ее размера слова; дело обстоит так по ряду причин.

Скорость

современные процессоры имеют несколько уровней кэш-памяти, что данные должны быть выжиты; поддержка однобайтовых чтений сделала бы пропускную способность подсистемы памяти плотно связанной с пропускной способностью модули выполнения (иначе зависящий от ЦП); это все напоминает о том, как режим PIO был превзойден DMA по многим из тех же причин в жестких дисках.

ЦП всегда чтения в его размере слова (4 байта на 32-разрядном процессоре), поэтому когда Вы делаете невыровненный доступ адреса — на процессоре, который поддерживает его, — процессор собирается считать несколько слов. ЦП считает каждое слово памяти, которой колеблется между Ваш требуемый адрес. Это вызывает усиление до 2X количество транзакций памяти, требуемых получить доступ к запрошенным данным.

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

struct mystruct {
    char c;  // one byte
    int i;   // four bytes
    short s; // two bytes
}

На 32-разрядном процессоре это, скорее всего, было бы выровненное как показанный здесь:

Struct Layout

процессор может считать каждого из этих участников в одной транзакции.

Говорят, что у Вас была упакованная версия структуры, возможно, от сети, где это было упаковано для эффективности передачи; это могло бы выглядеть примерно так:

Packed Struct

Чтение первого байта будет тем же.

, Когда Вы просите, чтобы процессор дал Вам 16 битов от 0x0005, это должно будет считать слово из от 0x0004, и сдвиг оставил 1 байт для размещения его в 16-разрядный регистр; некоторая дополнительная работа, но большинство может обработать это в одном цикле.

, Когда Вы попросите 32 бита от 0x0001, чтобы Вы добрались 2X усиление. Процессор будет читать из 0x0000 в регистр результата, и сдвиг оставил 1 байт, затем читайте снова из 0x0004 во временный регистр, право сдвига 3 байта, тогда OR это с регистром результата.

Диапазон

Для любого данного адресного пространства, если архитектура может предположить, что 2 LSBs всегда 0 (например, 32-разрядные машины) тогда, это может получить доступ к в 4 раза большей памяти (2 сохраненных бита могут представить 4 отличных состояния), или тот же объем памяти с 2 битами для чего-то как флаги. Снимание 2 LSBs адреса дало бы Вам 4-байтовое выравнивание; также называемый шаг из 4 байтов. Каждый раз, когда адрес увеличен, он эффективно увеличивает бит 2, не укусил 0, т.е. последние 2 бита будут всегда продолжать быть 00.

Это может даже влиять на физический дизайн системы. Если адресной шине нужно 2 меньше битов, может быть 2 меньше контактов на ЦП, и 2 меньше трассировок на печатной плате.

Атомарность

ЦП может воздействовать на выровненное слово памяти атомарно, означая, что никакая другая инструкция не может прервать ту операцию. Это очень важно для корректной операции многих структуры данных без блокировок и другой параллелизм парадигмы.

Заключение

система памяти процессора вполне немного более сложна и включена, чем описанный здесь; обсуждение , как x86 процессор на самом деле обращается к памяти , может помочь (много процессоров работают так же).

существует намного больше преимуществ для соблюдения выравнивания памяти, которое можно считать в эта статья .

IBM, основное использование компьютера должно преобразовать данные. Современные архитектуры памяти и технологии были оптимизированы за десятилетия для упрощения получения большего количества данных, в, и между больше и более быстрое выполнение units†“высоконадежным способом.

Премия: Кэши

Другое выравнивание для производительности, на которое я сослался ранее, является выравниванием на строках кэша, которые являются (например, на некоторых центральных процессорах) 64B.

Для большего количества информации о том, сколько производительности может быть получено путем усиления кэшей, смотрите на Галерея Эффектов Кэша Процессора ; от этого вопрос на размерах строки кэша

Понимание строк кэша может быть важно для определенных типов оптимизации программы. Например, выравнивание данных может определить, касается ли операция одной или двух строк кэша. Как мы видели в примере выше, это может легко означать, что в неправильно выровненном случае, операция будет вдвое медленнее.

288
ответ дан joshperry 23 November 2019 в 20:26
поделиться

Вы можете с некоторыми процессорами (, nehalem может сделать это ), но ранее весь доступ к памяти был выровненный на 64-разрядном (или 32-разрядный) строка, потому что шина 64 бита шириной, необходимо было выбрать 64 бита за один раз, и было значительно легче выбрать их в выровненных 'блоках' 64 битов.

Так, если Вы хотели получить единственный байт, Вы выбрали 64-разрядный блок и затем замаскировали от битов, которые Вы не хотели. Легкий и быстрый, если Ваш байт был в правильном конце, но если бы это было посреди того 64-разрядного блока, необходимо было бы замаскировать от нежелательных битов и затем сместить данные к правильному месту. Хуже, если Вы хотели 2-байтовую переменную, но это было разделено через 2 блока, тогда это потребовало дважды необходимых доступов памяти.

Так, как все думают, память является дешевой, они просто заставили компилятор выровнять данные по размерам блока процессора, таким образом, Ваш код работает быстрее и более эффективно за счет потраченной впустую памяти.

22
ответ дан gbjbaanb 23 November 2019 в 20:26
поделиться

На PowerPC можно загрузить целое число из нечетного адреса без проблем.

Sparc и I86 и (я думаю) Itatnium повышают аппаратные исключения при попытке этого.

Одна загрузка на 32 бита по сравнению с четырьмя загрузками на 8 битов не будет иметь большое значение на большинстве современных процессоров. Являются ли данные уже в кэше или не будут иметь намного больший эффект.

0
ответ дан Clifford 23 November 2019 в 20:26
поделиться
Другие вопросы по тегам:

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