Я смотрел на сборочном Visual Studio, созданный для этой простой программы x64:Почему VS делает imul rax, rax, 0 вместо простого перемещения?
struct Point {
int a, b;
Point() {
a = 0; b = 1;
}
};
int main(int argc, char* argv[])
{
Point arr[3];
arr[0].b = 2;
return 0;
}
И когда он встречает обр [0] .b = 2, он генерирует это:
mov eax, 8
imul rax, rax, 0
mov dword ptr [rbp+rax+4],2
Почему это делает imul rax, rax, 0 вместо простых mov rax, 0, или даже xor rax, rax? Как imum более эффективен, если вообще?
Попробуйте выполнить компиляцию с помощью переключателей оптимизации. –
Я пробовал без оптимизации и с/02, но он все еще делал imul rax, rax, 0.С полной оптимизацией я даже не мог заставить его писать что-либо в arr [0], он хранил все как временную переменную или что-то вроде этого. –
Ваш VS - это не то, что мне кажется. Это не создает никакого кода с/O2, как ожидалось. Повторяя код, чтобы оптимизатор не смог удалить назначение, выдает mov dword ptr [rsp + 24h], 2, как и ожидалось. imul генерируется только в неоптимизированной сборке. –