在c ++结构创建中执行速度更快

时间:2013-07-05 09:16:37

标签: c++ structure

我正在研究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));

3 个答案:

答案 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。

3.9.1基本类型[basic.fundamental]

8
...
The value representation of floating-point types is implementation-defined.
...

因此,如果出现奇怪的浮动表示,您最终可能会在浮点数中得到非零值。

相关问题