我在c++上工作,我有一个包含所有100个float变量的结构,我将在无参数构造函数中使用值0对它们进行initialize,那么哪种方法更快呢?
类型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));发布于 2013-07-05 17:26:35
名为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-05 17:26:37
在没有度量的情况下,清理可能会更快,但更糟糕,而且,如果您编写的代码是您实际实现的代码,那么清理实际上会工作得更好。第二种方式在任何情况下都不是特别好的风格,你应该使用成员初始化。
在任何情况下,我都更倾向于使用std::array (C++11)或std::vector,甚至是普通数组。
发布于 2013-07-05 18:13:03
第二个版本,除了已经提到的缺陷,实际上并不保证memset之后的浮点值将是0.0。
3.9.1基本类型basic.fundamental
8
...
The value representation of floating-point types is implementation-defined.
...
因此,在使用奇怪的浮点表示的情况下,您的浮点数中可能会出现非零值。
https://stackoverflow.com/questions/17485310
复制相似问题