gpt4 book ai didi

通过指针复制复杂的结构

转载 作者:太空狗 更新时间:2023-10-29 15:52:33 25 4
gpt4 key购买 nike

我有一个与性能相关的问题。比方说,我有某种结构,就像这样:

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;

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

我有以下选择:

直接使用指针:

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

*PtToCopy = *PtToBase

或者使用 uint8 指针并逐字节复制它(假设结构中没有挂起,并且我们知道它的大小)

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

while(SizeIsNotZero--)
{
*CpyPtrCopy++ = *CpyPtrBase++
}

这道题的主题不是malloc之类的细节,而是idea。感谢您的建议,致以最诚挚的问候!

最佳答案

简单结构赋值:

COPY = BASE ;

*PtToCopy = *PtToBase ;

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

逐字节编码的高级副本可能一样快,但不太可能。在除 8 位架构之外的所有架构上,它可能会更慢。

比字节复制更好的方法是:

memcpy( PtToCopy, PtToBase, sizeof(*PtToCopy) ) ;

或者只是:

memcpy( &COPY, &BASE, sizeof(COPY) ) ;

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

如果你真的需要知道,在你的目标上进行基准测试,或者检查你的编译器生成的汇编代码,但我怀疑这是一个“微优化”,你可能会通过考虑你的在更高更全面或更抽象的层次上进行代码设计。设计高效的数据结构和避免完全复制数据的方法往往会带来更大的性能提升。

关于通过指针复制复杂的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18925712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com