Использование временного значения для указателя в функции - PullRequest
0 голосов
/ 08 января 2019

Я просмотрел пример AES с микрочипа. Они пишут следующий сегмент кода:

bool AES_encrypt(uint8_t * plaintext, uint8_t * ciphertext, uint8_t * key)
{
    bool encrypt_ok;

    uint8_t * temp_key = key;
    for(uint8_t i = 0; i < AES_BLOCK_LENGTH; i++){
        AES.KEY =  *(temp_key++);
}

Почему они копируют указатель во временную переменную? Я проверил это в студии Atmel и дизассемблере, и в обоих случаях

bool AES_encrypt(uint8_t * plaintext, uint8_t * ciphertext, uint8_t * key)
{
    bool encrypt_ok;

    /* Load key into AES key memory. */
    uint8_t * temp_key = key;
    for(uint8_t i = 0; i < AES_BLOCK_LENGTH; i++){
        AES.KEY =  *(temp_key++);
}   

bool AES_encrypt(uint8_t * plaintext, uint8_t * ciphertext, uint8_t * key)
{
    bool encrypt_ok;

    /* Load key into AES key memory. */
    for(uint8_t i = 0; i < AES_BLOCK_LENGTH; i++){
        AES.KEY =  *(key++);
}

приводит к тому же коду ассемблера (опция -O1). Так какова цель этой записи?

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Хорошей практикой считается не изменять аргументы вызова функции (т. Е. Использовать их как локальные переменные). Вероятно, это является причиной использования временной переменной temp_key, поскольку здесь увеличивается указатель:

AES.KEY =  *(temp_key++);

Это , а не , который следует путать с изменением значения цели-указателя (что, вероятно, здесь сделал downvoter). Это обычная практика, конечно.

См. Также обсуждение здесь: Использование аргументов функции в качестве локальных переменных

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

0 голосов
/ 08 января 2019

Как вы заметили, в оптимизированной сборке нет никаких преимуществ или недостатков в производительности, любой компилятор, достойный своей солидности, сведет их обоих к почти одинаковому IR на ранних стадиях оптимизации.

Это может быть просто стилистический выбор, некоторые люди находят непонятным прямое изменение параметров, и они предпочитают оставлять их такими, какие они есть на протяжении всей функции; вдвойне, так как это пример кода, поэтому он должен быть понятен программистам всех уровней.

Дополнительные преимущества этого подхода включают в себя тот факт, что проще добавить код, который ссылается на исходные значения (возможно, отладочные операторы) или проверять исходное значение в отладчике в сборках отладки.

...