我正在研究c ++,我有一个结构,其中包含所有最多100个float
变量,我将在没有参数构造函数的情况下initialize
使用值0
,所以哪种方式更快?
类型1:
struct info
{
//no argument constructor
info();
float x1;
float x2;
.
.
.
float x100;
}Info;
info::info()
{
float x1 = 0;
float x2 =0;
.
.
.
.
.
float x100 = 0;
}
//creation
Info* info1 = new Info();
Type2:
typedef struct info
{
float x1;
float x2;
.
.
.
.
float x100;
}Info;
Info* infoIns = new Info;
memset(infoIns,0,sizeof(Info));
答案 0 :(得分:1)
一百个名为x1 .. x100的变量只是CALLS成为一个数组(或者如果数字变化,可能使用向量)
在这种情况下,std::fill(x, x+100, 0.0f)
可能会击败上述所有选择。
更好的解决方案可能只是初始化整个对象:
Info* infoIns = new Info();
或
Info infoIns = {}; // C++11
或
Info infoIns = Info();
每当这是一个表现问题时,唯一适用的答案就是“你可以衡量的”。我可以坐在这里解释为什么根据我的经验,在我的机器(或我的机器)上,方法A比方法B或方法C更快。但是如果你使用不同的编译器,或者有不同的处理器,那么可能不适用因为你使用的编译器正在做一些不同的事情。
无论哪个“更快”,您都应该使用构造函数将值设置为零。如果你想使用memset
,那么一定要这样做,但是在构造函数中。这样,在尝试使用它之前,您不会在代码中找到一些将FORGOT设置为零的位置。请记住,使用memset
将struct / class设置为零非常危险。如果类或结构具有虚拟成员函数(或包含某些对象),则很可能会覆盖描述虚函数的VPTR。这是一件坏事。因此,如果您想使用memset,请将其与x1
一起使用,并使用100 *sizeof(float)
的大小(但使用数组可能是更好的选择)。
答案 1 :(得分:0)
在没有测量的情况下,清算可能会更快但更糟糕,并且,如果您编写的代码是您实际执行的代码,那么清算实际上会更好。第二种方式在任何情况下都不是特别好的风格,你应该使用成员初始化。
在任何情况下,我都更倾向于使用std::array
(C ++ 11)或std::vector
甚至是普通数组。
答案 2 :(得分:0)
第二个版本,除了已经提到的缺陷之外,实际上并不保证在memset之后浮点值将为0.0。
8
...
The value representation of floating-point types is implementation-defined.
...
因此,如果出现奇怪的浮动表示,您最终可能会在浮点数中得到非零值。