Я пробовал следующий код в Compile Explorer ( ссылка для кода ), компилятор ARM g cc 8.3.1 и опции -std = gnu ++ 2a -O3
#include <cstdint>
#include <type_traits>
template<std::uint32_t TP_Address, typename TP_Type = bool>
TP_Type foo(){
return *reinterpret_cast<TP_Type*>(TP_Address);
};
volatile bool b1;
volatile bool b2;
[[noreturn]] int main(void) {
b1 = foo<0x42000000, volatile bool>();
}
и получил следующий результат на панели ассемблера
main:
mov r3, #1107296256
ldrb r3, [r3] @ zero_extendqisi2
ldr r2, .L2
and r3, r3, #255
strb r3, [r2]
.L2:
.word .LANCHOR0
b1:
b2:
Я не могу понять причину "и операции" с # 255 (0xFF). Фактически, если исключить изменчивый квалификатор, это явно лишнее «и операция» исчезнет, но тогда (как и ожидалось) компилятор оптимизирует код, игнорируя то, что значение склонно к изменению и приводя к неверным результатам в последующих чтениях.
Учитывая, что я точно знаю, что этот указанный c адрес содержит логическое значение (ie, шестнадцатеричное значение равно 0x0 или 0x1), как я могу избавиться от «и операции»?