0

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

类型2:

typedef struct info
{
  float x1;
  float x2;
  .
  .
  .
  .
  float x100;
 }Info;

Info* infoIns = new Info;
memset(infoIns,0,sizeof(Info));
4

3 回答 3

1

一百个变量称为 x1 .. x100 只是调用为一个数组(或者如果数字变化,可能使用向量)

在这种情况下std::fill(x, x+100, 0.0f),可能会击败上述所有选择。

更好的解决方案可能是只初始化整个对象:

Info* infoIns = new Info();

或者

Info infoIns = {};  // C++11

或者

Info infoIns = Info();

每当涉及性能问题时,唯一适用的答案是“您可以衡量什么”。我可以坐在这里确切地解释为什么根据我的经验,在我的机器(或我的机器)上,方法 A 比方法 B 或方法 C 快。但是如果您使用不同的编译器或具有不同的处理器,则可能不适用根本,因为您使用的编译器正在做一些不同的事情。

无论哪个“更快”,您都应该使用构造函数将值设置为零。如果你想使用memset,那么一定要这样做,但在构造函数内部。这样,您就不会在代码中找到在尝试使用之前忘记将其中一个结构设置为零的地方。请记住,使用将结构/类设置为零memset是非常危险的。如果类或结构具有虚成员函数(或包含一些具有虚成员函数的对象),这很可能会覆盖描述虚函数的 VPTR。这是一件坏事。因此,如果您想使用 memset,请将其与x1大小一起100 *sizeof(float)使用(但再次使用数组可能是更好的选择)。

于 2013-07-05T09:26:35.057 回答
0

在没有测量的情况下,清除可能会更快但更糟糕,而且,如果您编写的代码是您实际实现的,那么清除实际上会更好地工作。在任何情况下,您拥有的第二种方式都不是特别好的样式,您应该使用成员初始化。

在任何情况下,我都更倾向于使用std::array(C++11)std::vector甚至是普通数组。

于 2013-07-05T09:26:37.467 回答
0

第二个版本,除了已经提到的缺陷,实际上并不能保证在 memset 之后浮点值将是 0.0。

3.9.1 基本类型[basic.fundamental]

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

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

于 2013-07-05T10:13:03.317 回答