Правда ли что операции с 8 битными числами происходят медленнее, чем с 64 битными?
Правда ли что на 64 разрядных машинах арифметические операции с 8 битными целыми числами происходят медленнее, чем с 64 битными, потому что операции с частью регистра требуют вспомогательных действий?
Евгений Обыкновенный, и что это? Это документальный источник, в котором автор делает прямое заявление по теме твоего вопроса?
Давай переспрошу иначе. Приведи книги или статьи, где автор делает однозначное заявление о том, что написано у тебя в вопросе.
Евгений Шатунов,
Из книги Game Engine Architecture by Jason Gregory:
"It’s possible to access data items that are narrower than the width of a machine’s data bus, but it’s typically more costly than accessing items whose widths match that of the data bus. For example, when reading a 16-bit value on a 64-bit machine, a full 64 bits worth of data must still be read from memory. The desired 16-bit field then has to be masked off and possibly shifted into place within the destination register."
Почему mov ah, bh и mov al, bl вместе намного быстрее, чем одна инструкция mov ax, bx?
Евгений Обыкновенный, давай с цитатой разберемся для начала. Эту книгу я помню, там все довольно прозрачно написано.
For example, when reading a 16-bit value on a 64-bit machine, a full 64 bits worth of data must still be read from memory.
Здесь все написано верно. Из памяти в регистр быстрее и проще поднять блок размером с регистр. Точнее, сегодня из памяти поднимается уже блок размером с линию кэша процессора и только потом память из этого блока в кэше процессора заводится в регистр. В зависимости от поколения и типа процессора размер линии кэша может быть от 32Б и до 128Б. До 128 Байт. И выборка памяти в кэш сегодня происходит очень быстро, особенно если укладывается в предсказания.
Но твой вопрос о другом. Твой вопрос не о передаче данных между памятью и регистром. Твой вопрос об арифметических операциях и их скорости относительно используемых регистров.
потому что операции с частью регистра требуют вспомогательных действий
Вот об этом конкретно где-нибудь что-нибудь написано? В каком-нибудь источнике информации.
Лично я ничего про части регистров не знаю. ah и al - это ровно такие же регистры, как и ax их объединяющий, как и eax вмещающий в себя ax, как и rax вмещающий в себя eax. Это все - регистры. Просто они означают разные диапазоны одного и того же набора бит.
И опкоды команд работы с этими регистрами будут разные. Тактовые издержки по командам регистров разного размера будут прямо пропорциональны размеру регистра. Однако, современный C++ во всю использует integer promotion, в результате которого практически всегда и практически все арифметические операции выполняется на регистрах общего назначения с полной шириной. И это сегодня выполняется настолько быстро, что об этом можно не задумываться.
Поэтому ответ на твой вопрос всегда будет только отрицательным. Нет, о чем ты спрашиваешь - это неправда.
Но твой вопрос о другом. Твой вопрос не о передаче данных между памятью и регистром. вой вопрос об арифметических операциях
Так обычно при арифметических операциях содержимое регистра складывается с данными из памяти.
Однако, современный C++ во всю использует integer promotion, в результате которого практически всегда и практически все арифметические операции выполняется на регистрах общего назначения с полной шириной.
Отладчик в Visual Studio показывает, что char-ы по умолчанию складываются с помощью ассемблерных команд с AL.
И это сегодня выполняется настолько быстро, что об этом можно не задумываться.
Это зависит от задачи. Все относительно. Для объемных математических вычислений это может быть критически важным.