LINUX.ORG.RU

История изменений

Исправление alysnix, (текущая версия) :

Цикл на несколько строчек с объявлением временных переменных и замусориванием контекста, и один-единственный вызов функции высшего порядка.

fn qspCRC(data: &[u8]) -> i32 {
    data.iter().fold(0, |crc, b| { 
            let tbl  = qspCRCTable[((crc & 0xFF) as u8 ^ b) as usize];
            (tbl as i32^crc>>8) ^ 0xD202EF8Du32 as i32
        })
}

эквивалентный(почти) код на си

int qspCRC(uint8* ptr, uint len) {
    int crc = 0;
    while (len--)
        crc = (qspCRCTable[(crc & 0xFF) ^ *ptr++] ^ crc >> 8) 
              ^ 0xD202EF8D;
    return crc;
}

а теперь вопрос - где больше промежуточных переменных? в сишном коде это лишь crc. в растовом еще две переменных.

растовый код принимал сразу косорукую «ссылку на массив» &[u8], что не есть эквивалент void* - это есть «указатель на что угодно», отчего требовался еще один поинтер внутри сишной функции.

также в растовом коде длина не передается, а в сишном она есть.

То есть растовый код не есть эквивалент сишному от автора. как в растовом передается длина массива - непонятно. видиомо она записана в самом массиве. но это уже по другому организованные данные.

Передавайте в растовую функцию нетипизированный адрес и длину, тогда имеет смысл сравнивать.

Исходная версия alysnix, :

Цикл на несколько строчек с объявлением временных переменных и замусориванием контекста, и один-единственный вызов функции высшего порядка.

fn qspCRC(data: &[u8]) -> i32 {
    data.iter().fold(0, |crc, b| { 
            let tbl  = qspCRCTable[((crc & 0xFF) as u8 ^ b) as usize];
            (tbl as i32^crc>>8) ^ 0xD202EF8Du32 as i32
        })
}

эквивалентный(почти) код на си

int qspCRC(uint8* ptr, uint flen) {
    int crc = 0;
    while (len--)
        crc = (qspCRCTable[(crc & 0xFF) ^ *ptr++] ^ crc >> 8) 
              ^ 0xD202EF8D;
    return crc;
}

а теперь вопрос - где больше промежуточных переменных? в сишном коде это лишь crc. в растовом еще две переменных.

растовый код принимал сразу косорукую «ссылку на массив» &[u8], что не есть эквивалент void* - это есть «указатель на что угодно», отчего требовался еще один поинтер внутри сишной функции.

также в растовом коде длина не передается, а в сишном она есть.

То есть растовый код не есть эквивалент сишному от автора. как в растовом передается длина массива - непонятно. видиомо она записана в самом массиве. но это уже по другому организованные данные.

Передавайте в растовую функцию нетипизированный адрес и длину, тогда имеет смысл сравнивать.