性能:最好是初始化变量或只是填充它

Performance: better to inizialize variable or just fill it?

本文关键字:填充 变量 初始化 性能      更新时间:2023-10-16

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

有人能解释一下在内存管理方面有什么不同吗?我倾向于认为第二个选项更"干净",但我不能真正争论为什么。

在内存管理方面,数据显然将位于内存中的不同位置。全局变量位于静态段中,而局部变量位于堆栈中。它是否每次都被创建?是的。它会影响性能吗?视情况而定。如果datastr真的像你在这里显示的那样,那么没有。

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

选项2在样式方面显然更好。当看到函数时,读者将拥有所有的东西,而不必跳来跳去破译数据流。

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

datastr str1(*reinterpret_cast<datastr*>(Data));

顺便说一句,你的语法看起来更像c#而不是c++。