指针复杂的结构复制

Tom*_*mas 3 c embedded performance pointers

我有一个与绩效相关的问题.让我们说,我有一些结构,像这样:

typedef struct
{
    uint8_t FirstSofRec     :1;     //SOF byte
    uint8_t SecSofRec       :1;     //SOF byte
    uint8_t RecPending      :1;     //Pending flag
    uint8_t Timeout         :1;     //Timeout flag
    uint8_t RecCompleted    :1;     //Recievein completed flag
    uint8_t CrcMatch        :1;     //CRC match flag
    uint8_t DataLength      :2;     //Data length field (1 - 8)
}Reciever_flags_t;

typedef struct  
{
    Reciever_flags_t flags;
    uint8_t SofFrame[2];
    uint8_t MsgBuffer[MAX_REC_BUFF_SIZE];
    uint8_t CRC;
}Reciever_struct_t;
Run Code Online (Sandbox Code Playgroud)

什么是最快的(在性能意义上,编写嵌入式代码)方法将一个结构的内容复制到另一个结构?

我有以下选择:

直接指针使用:

Reciever_struct_t BASE;
Reciever_struct_t COPY;
Reciever_struct_t *PtToBase = &BASE;
Reciever_struct_t *PtToCopy = ©

*PtToCopy = *PtToBase
Run Code Online (Sandbox Code Playgroud)

或者使用让我们说uint8指针并逐字节地复制它(假设结构中没有待处理的,我们知道它的大小)

Reciever_struct_t BASE;
Reciever_struct_t COPY;
uint8_t *CpyPtrBase = (uint8_t *)&BASE;
uint8_t *CpyPtrCopy = (uint8_t *)©

while(SizeIsNotZero--)
{
*CpyPtrCopy++ = *CpyPtrBase++
}
Run Code Online (Sandbox Code Playgroud)

这个问题的主题不是关于malloc等的细节,只是关于想法.谢谢你的建议,最好的问候!

Cli*_*ord 8

简单的结构分配:

COPY = BASE ;
Run Code Online (Sandbox Code Playgroud)

要么

*PtToCopy = *PtToBase ;
Run Code Online (Sandbox Code Playgroud)

将由编译器生成的代码提供,因此将针对目标和您设置的编译器选项进行优化.

高级编码的逐字节复制可能同样快,但速度更快.除了8位架构外,它可能会更慢.

比字节副本更好的方法是:

memcpy( PtToCopy, PtToBase, sizeof(*PtToCopy) ) ;
Run Code Online (Sandbox Code Playgroud)

要不就:

memcpy( &COPY, &BASE, sizeof(COPY) ) ;
Run Code Online (Sandbox Code Playgroud)

但这依赖于库函数的实现,memcpy()它可能与编译器为赋值生成的函数相同或不同,但也可能针对目标进行优化,但不会考虑编译器设置,因为它是预先编译的.

如果你真的需要知道,在目标上对它进行基准测试,或者检查编译器生成的汇编程序代码,但我怀疑这是一个"微优化",你可以通过考虑你的代码设计来获得更好的性能提升.更高的整体或抽象水平.通过设计有效的数据结构和避免完全复制数据的方法,可以获得更大的性能提升.