Re[5]: C vs С++ Да.
От: FR  
Дата: 15.11.22 19:01
Оценка: 4 (2) +1
Здравствуйте, rudzuk, Вы писали:

R>Не знаю что мешает, вот второй исходник и точно такая же наркомания: https://github.com/tl8roy/spritz_cipher/blob/704da9bd8546871d07a51ca14c4080e3a083d037/src/lib.rs#L165


Да нашел что мешает, переполнение безнаковых целочисленных в расте. В си просто такое переполнение игнорируется и считает по модулю. Но почему трудолюбивый автор раст кода везде использует wrapping_add когда есть удобная обертка Wrapping непонятно. С ней можно сделать так:
use std::num::Wrapping;

fn main() {
    // начальные переменные
    let s:[u8; 256] = [10; 256];
    let (i, j, k, z) = (250u8, 250u8, 250u8, 250u8); 
    // заворачиваем (если операция частая можно макрос сварганить).
    let (i, j, k) = (Wrapping(i), Wrapping(j), Wrapping(k));
    let mut z = Wrapping(z);
    // сам код
    let S = |a: Wrapping<u8>| Wrapping(s[a.0 as usize]);
    z = S(j + S(i + S(z + k)));
    // разворачиваем результат
    let z = z.0;
    dbg!(z);
}

тут

И судя по его коду по твоей ссылке можно было не обертывать при каждом использовании а сразу объявить переменные как Wrapping<u8> тогда свертки развертки не нужны. В таком случае все совсем просто будет, практически как на си:
use std::num::Wrapping;

fn main() {
    // начальные переменные
    let s = [Wrapping(10u8); 256];
    let (i, j, k) = (Wrapping(250u8), Wrapping(250u8), Wrapping(250u8));    
    let mut z = Wrapping(250u8);
    // сам код
    let S = |a: Wrapping<u8>| s[a.0 as usize];
    z = S(j + S(i + S(z + k)));
    dbg!(z);
}



R>Покажи уже, как правильно и без потери производительности.


Судя по ассемблерному коду тут оптимизируется вусмерть.

FR>> И также что мешает в си засунуть все переменные в структуру (для получения "красивого" self->) и вместо макроса зафигарить такую же красоту по месту как в раст примере?


R>
R>#define smem(x)  s->mem[ (x) & 0xff ]
R>...
s->>z = smem (s->j + smem (s->i + smem (s->z + s->k)))
R>


R>Ничто не мешает И читаемость не страдает, как по мне.


Ну нет для полноты картины надо без макроса, как автор кода на расте, мы же на стили хотим посмотреть.

R>Тут демонстрация того, что в раст встроен обфускатор на уровне языка. Ну правда, ведь невозможно же код читать И это примитивное выражение, а если на метод update посмотреть...


Тут похоже демонстрация не очень хорошего знания языка автором кода, с таким знанием он и на си без макросов трудолюбиво бы все расписал.
Отредактировано 15.11.2022 19:06 FR . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.