c - 在函数中使用指针的临时值

标签 c assembly avr

我查看了 microchip 的 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 studio 和反汇编程序验证了这两个案例

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 选项)。那么这个符号的目标是什么?

最佳答案

正如您所注意到的,在优化的构建中没有任何性能优势或劣势,任何称职的编译器都会在优化的早期阶段将它们降低到几乎完全相同的 IR。

这可能只是一种风格选择,有些人觉得直接修改参数很困惑,他们更喜欢在整个函数中保持原样;双重如此,因为这是示例代码,所以它意味着所有级别的程序员都可以轻松理解。

这种方法的额外优势包括,它可以更轻松地添加引用原始值(可能是调试语句)的代码或在调试版本中的调试器中检查原始值。

关于c - 在函数中使用指针的临时值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54086849/

相关文章:

C 中的 Cast 表达式语义

C 预处理器 token 替换因解析错误而失败

assembly - MOVDQA 和 MOVAPS x86 指令之间的区别?

avr - Atmel Studio AVR 操作数超出范围

c - 如何从ATmega32中的软件SPI读取32位变量?

c++ - 文件是否需要扩展名才能在 C/C++ 中使用 open() 打开?

无法释放 libpng 中的 info_ptr

c - 用 sscanf 读取日期

assembly - 为什么汇编程序仅在与 crt1.o crti.o 和 crtn.o 链接时才起作用?

c - avr c : creating blink/beep sound based on characters in string