假设我有一个每秒调用10次的函数,例如:
void RxData(System::Byte *Data){}
在这个函数中,我想用* Data填充一个结构,其结构如下:
Struct datastr{
float first;
float second;
}
在性能和内存使用方面,最好声明一个外部变量datastr str1
,然后执行:
void RxData(System::Byte *Data){str1=*reinterpret_cast<datastr*>(Data);}
或每次结构重新初始化,如:
void RxData(System::Byte *Data){datastr str1; str1=*reinterpret_cast<datastr*>(Data);}
有人可以解释内存管理方面的差异吗?我倾向于认为第二种选择更“干净”,但我不能真正地争论为什么。
答案 0 :(得分:1)
坚持使用版本2,它具有更好的局部性,更好的可读性,并且不易出错。如果每秒调用RxData 10次,我甚至不会考虑优化初始化datastr。但如果您真的关心,那么您可以使用copy ctor for datastr并将代码更改为:
datastr str1(*reinterpret_cast<datastr*>(Data));
BTW,你的语法看起来更像C#,而不像C ++。
答案 1 :(得分:1)
在内存管理方面,数据显然位于内存的不同位置。全局变量放在静态段中,而局部变量放在堆栈上。它每次都被创造出来吗?是。它会影响性能吗?这取决于。如果datastr
看起来像你在这里显示的那样,那么没有。
它甚至可能具有稍微好一点的性能,因为在您的函数执行时很可能存在于缓存中。一个全局变量也可能在那里,可能会,但它在不同的内存位置,所以可能意味着预取器将有更多的工作要做。
选项2在风格上显然更好。阅读器将在查看功能时掌握所有内容,而不必跳转来破译数据流。