C++ 性能:最好是将变量序列化,还是只填充它?

C++ 性能:最好是将变量序列化,还是只填充它?,c++,memory-management,struct,c++builder,C++,Memory Management,Struct,C++builder,假设我有一个每秒调用10次的函数,类似于: void RxData(System::Byte *Data){} 在这个函数中,我想用*数据填充一个结构,其中结构类似于: Struct datastr{ float first; float second; } 在性能和内存使用方面,最好声明一个外部变量datastr str1,然后执行以下操作: void RxData(System::Byte *Data){str1=*reinterpret_cast<datastr*>(Dat

假设我有一个每秒调用10次的函数,类似于:

void RxData(System::Byte *Data){}
在这个函数中,我想用*数据填充一个结构,其中结构类似于:

Struct datastr{
float first;
float second;
}
在性能和内存使用方面,最好声明一个外部变量
datastr str1
,然后执行以下操作:

void RxData(System::Byte *Data){str1=*reinterpret_cast<datastr*>(Data);}
void RxData(系统::字节*数据){str1=*重新解释转换(数据);}
或者每次重新初始化结构时,如:

void RxData(System::Byte *Data){datastr str1; str1=*reinterpret_cast<datastr*>(Data);}
void RxData(System::Byte*Data){datastr str1;str1=*重新解释强制转换(Data)}

有人能解释一下内存管理方面的区别吗?我倾向于认为第二个选项更“干净”,但我无法解释原因。

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

datastr str1(*reinterpret_cast<datastr*>(Data));
datastr str1(*重新解释铸件(数据));

,你的语法看起来更像C++,而不是C++。

< p>在内存管理方面,数据显然会位于内存的不同位置。全局变量放置在静态段中,而局部变量位于堆栈上。它是不是每次都被创建?对它会影响性能吗?视情况而定。如果
datastr
与此处显示的内容非常相似,则不会

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


选项2在风格上显然更好。读者在看到函数的同时会手头上有所有的东西,而不必跳来跳去破译数据流。

这两个函数都不编译,即使编译了,它们也会做不同的事情……这不是一个有用的评论,在我看来,这个问题并不是那么模糊。在每次函数调用时重新初始化变量,还是将其声明为extern更好?我可能在问题中犯了一些编码错误,请原谅我,或者尝试修复它们:)不,您可以修复它。您声称有两种编写代码的可选方法,并希望知道哪种方法更适合于风格或性能。但我甚至不认为是这样。当你有两个代码的代码,它们有相同的可观察的行为,然后我们可以讨论哪个更好。如果你有正确的方法和错误的方式,你的错误的方法是:LOL,我不知道Pauli语句是否是C++的,不管怎样,我不需要写一个拷贝cTor来启用这个语法。一个默认的复制ctor工作得很好。@WernerHenze你的btw对我来说很有趣,在什么意义上它看起来像C#?我从未用C#编写过代码,我正试图改进我的C++@BiA系统::Byte看起来像.NET类型,所以我被误导了。“结构”不是有效的C++,它必须写下。System::字节是.NET类型,所以,即使它是一个有效的C++来定义命名空间系统{TyPulf无符号char字节;},最好不要这样做。哦,如果你在C++中使用C++语言,那么最好用C++和CLI来标记你的问题。告诉您是在混合设置中使用它还是在纯托管设置中使用它会很有帮助。几乎不知道C++/CLI,我不确定Syt::By*是否是RealTytRCAST的合适类型,而普通的标准C++无符号char肯定是.@ Fikitik实际上<代码> DATAST/<代码>稍微复杂一点。这是一个由大约30个条目组成的结构。结构维度会影响性能吗?我特别想到的是,如果类型是。这基本上可以归结为如果它没有用户定义的构造函数,其他OO风格的东西,比如虚拟函数和指向成员数据成员的指针,所有非平凡的数据成员也都是pod。结构的大小无关紧要。在我提供的示例中,我打算将
datastr
作为一个POD。无论如何,你的观点很有趣,如果我添加一个costructor,比如:
struct datastr{explicit datastr(unsigned char*data){*this=*reinterpret_cast(data);}float first;float second;}
情况会有很大变化吗?除了pod之外,所有类型的reinterpret cast都没有定义,根据C++标准。不过,一般来说,编译器并没有那么严格,您所显示的内容通常都很好。我对构造函数的想法是,如果你不小心的话,它们会在你不期望的地方插入代码。例如
datastrstr;str=默认值在赋值之前构造str。如果您开始使用构造函数,您可能会运行过多的代码。在这里使用复制构造函数要好得多。