Я понимаю, что для некоторых людей это нифига не новость, но я человек измученный нарзаном и уже лет 20, наверное, не смотрел, что-ж там компилятор такого нагенерил на выходе.Берём такой код (это rust, если что):
И компилятор на голубом глазу выдаёт:
Т.е. эта зараза тупо повыкидывала все эти пляски с +1 к переменной, и тупо нафигачила констант...
Я, конечно,неоднократно читал, что бодаться с нынешними компиляторами в плане кода - такое себе занятие, но что прям настолько всё сурово - как-то не ожидал.
fn main() {
let mut src = 1u128;
let a = src.to_ne_bytes();
src += 1;
let b = src.to_le_bytes();
src += 1;
let c = src.to_be_bytes();
println!("{:#?} {:#?} {:#?}", a, b, c);
}
И компилятор на голубом глазу выдаёт:
sub rsp, 152
mov qword ptr [rsp + 16], 0
mov qword ptr [rsp + 8], 1
mov qword ptr [rsp + 32], 0
mov qword ptr [rsp + 24], 2
movabs rax, 216172782113783808
mov qword ptr [rsp + 48], rax
mov qword ptr [rsp + 40], 0
Т.е. эта зараза тупо повыкидывала все эти пляски с +1 к переменной, и тупо нафигачила констант...
Я, конечно,неоднократно читал, что бодаться с нынешними компиляторами в плане кода - такое себе занятие, но что прям настолько всё сурово - как-то не ожидал.
(no subject)
Date: 2021-03-13 12:50 (UTC)Если вам хочется +1 делать, то надо, чтоб src извне приходило. Тогда компилятор не будет знать, к чему 1 можно прибавить на этапе компиляции.
(no subject)
Date: 2021-03-14 01:32 (UTC)fn tmt(mut src: u128) { let a = src.to_ne_bytes(); src += 1; let b = src.to_le_bytes(); src += 1; let c = src.to_be_bytes(); println!("{:#?} {:#?} {:#?}", a, b, c); } pub fn main() { tmt(1) }Получаем:example::main: sub rsp, 152 mov qword ptr [rsp + 16], 0 mov qword ptr [rsp + 8], 1 mov qword ptr [rsp + 32], 0 mov qword ptr [rsp + 24], 2 movabs rax, 216172782113783808 mov qword ptr [rsp + 48], rax mov qword ptr [rsp + 40], 0(no subject)
Date: 2021-03-14 02:30 (UTC)(no subject)
Date: 2021-03-14 02:50 (UTC)Теперь по поводу "внешним модулем". Я могу сказать что tmt не просто fn, а pub fn. И тогда компилятор поступает прикольно.
1. Он делает таки отдельную функцию, которую можно вызвать.
2. Он всё равно в самом main не делает вызов а прошивает этот блок с константами.
Т.е. еня штырит не от раста как такового. Меня штырит от возможностей нынешних компиляторов (на сколько я понимаю - rust живёт поверх llvm).
(no subject)
Date: 2021-03-14 03:05 (UTC)(no subject)
Date: 2021-03-14 09:32 (UTC)Извне - это когда вообще извне.
(no subject)
Date: 2021-03-14 06:35 (UTC)