Перекрывающиеся переменные и производительность - PullRequest
1 голос
/ 18 февраля 2012

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

Когда несколько переменных объявляются в смежной памяти, насколько я понимаю, на очень низком уровне создаются регистры, которые инкапсулируют количество байтов, обычно 1, 2, 4 или 8. Это позволяет этим двоичным диапазонам быть повернутыми в двоичном формате, а также восприниматься процессором как числа и таким образом изменяться с помощью простой математики, такой как сложение, вычитание, умножение и деление.

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

Например, в блоке выделенной памяти, где каждый бит начинается с 0. Байты от 0 до 3 могут использоваться как целые числа, а также байты с 1 по 4. Первый может быть установлен в значение передвторой диапазон был умножен на 3.

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

1 Ответ

1 голос
/ 18 февраля 2012

В этом приеме нет ничего плохого, когда он выполняется в сборке: оптимизаторы обычно используют информацию о том, где находятся части целого числа, чтобы сохранить циклы ЦП и уменьшить размер кода.Например, когда 32-разрядная целочисленная переменная инициализируется значением, которое умещается только в 16 битах, оптимизирующие компиляторы заменят инструкцию, которая хранит 32-разрядное значение в памяти, более быстрой инструкцией, которая хранит 16-разрядное значение длямладшие биты переменной и очистить верхние 16 бит.Более того, многие оптимизаторы пошли бы еще дальше: если константа делится на 2 ^ 16, они сохранят значение, деленное на 2 ^ 16 на верхние 16 бит, и очистят младшие 16 бит.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...