性能:更好地初始化变量还是只填充变量?

时间:2013-05-14 07:50:00

标签: c++ memory-management struct c++builder

假设我有一个每秒调用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);}

有人可以解释内存管理方面的差异吗?我倾向于认为第二种选择更“干净”,但我不能真正地争论为什么。

2 个答案:

答案 0 :(得分:1)

坚持使用版本2,它具有更好的局部性,更好的可读性,并且不易出错。如果每秒调用RxData 10次,我甚至不会考虑优化初始化datastr。但如果您真的关心,那么您可以使用copy ctor for datastr并将代码更改为:

datastr str1(*reinterpret_cast<datastr*>(Data));
BTW,你的语法看起来更像C#,而不像C ++。

答案 1 :(得分:1)

在内存管理方面,数据显然位于内存的不同位置。全局变量放在静态段中,而局部变量放在堆栈上。它每次都被创造出来吗?是。它会影响性能吗?这取决于。如果datastr看起来像你在这里显示的那样,那么没有。

它甚至可能具有稍微好一点的性能,因为在您的函数执行时很可能存在于缓存中。一个全局变量也可能在那里,可能会,但它在不同的内存位置,所以可能意味着预取器将有更多的工作要做。

选项2在风格上显然更好。阅读器将在查看功能时掌握所有内容,而不必跳转来破译数据流。