1

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

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

4

2 回答 2

1

坚持使用版本 2,它具有更好的局部性、更好的可读性并且更不容易出错。如果每秒调用 RxData 10 次,我什至不会考虑优化初始化 datastr。但是,如果您真的很在意,那么您可以将复制 ctor 用于 datastr 并将您的代码更改为:

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

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

于 2013-05-14T08:41:55.680 回答
1

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

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

选项 2 在风格方面显然更好。阅读器在查看该功能时将掌握一切,而不必跳来跳去破译数据流。

于 2013-05-14T08:54:51.100 回答