性能:最好是初始化变量或只是填充它
Performance: better to inizialize variable or just fill it?
假设我有一个函数每秒被调用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++。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 将十六进制值设置为用于填充的字符变量时出现问题
- C++初始化并用变量填充 2D 数组
- 如何将矢量大小扩展一个元素并用变量填充它
- 为什么支撑初始化分配分配填充垃圾变量
- 缓存行大小的倍数的变量的缓存行填充
- 在使用结构体和用函数填充其变量(使用指针)时遇到问题
- 带有非默认构造类型的填充性std ::数组(无变量模板)
- 填充静态unordered_map局部变量
- 从文件中读取和填充单独的变量
- 用 '0' C++ 填充字符串流变量的右侧
- 如何在主程序流中不调用全局变量的情况下填充全局变量
- C++指向在另一个结构内部的结构中定义的变量(由用户填充)
- 用For循环填充Makefile变量
- 控制未初始化堆栈变量的填充值(例如0xCC)
- 性能:最好是初始化变量或只是填充它
- 我们是否可以创建一个类似scanf的函数,当所有参数都填充时返回true,否则返回false,而不循环遍历所有变量?
- 使用内存变量初始化填充位结构体