2013-09-24 57 views
1

我正在编写一个程序,其中速度优化是至关重要的。每增加1%速度都不错。C++在没有初始化的情况下在堆栈上分配

在一个被称为很多的函数中,我需要一个固定大小的(小)类MyClass数组。在开始时,我使用了std :: vector。整个事情是小的(通常为256项,类大小是12个字节,这意味着3072个字节,如果数组对准16字节)

现在它发生:使用

  • C型分配在堆栈上的数组MyClass [256]提高了性能。根据我的理解,这是因为没有内存分配/删除操作,堆栈分配是免费的。
  • 使用:: operator new使用内存分配,也提高了性能。因为它跳过了类的初始化,我不需要。除此之外,我希望尽可能避免原始内存初始化。

所以它应该更快分配堆栈和跳过初始化。如果需要,我可以重写类构造函数,但我不知道如何。

感谢,

艾蒂安

+0

“MyClass [256],在堆栈上分配”只是顺便说一句,你不能决定什么将在堆栈上,堆什么,标准没有澄清它,因为它只是指定有关生存期类型和存储类类型。所以它是编译器的自由决定因素;) – dhein

+0

好吧,这就是理论。我不知道任何不使用堆的新编译器和本地存储变量的堆栈。 –

+0

感谢理论的澄清......但我分发二进制文件,我的编译器确实在堆栈中分配了局部变量,它使我的应用程序运行得更快,所以即使没有保证,我也会采用它:) – galinette

回答

3

你不需要初始化?所以大概MyClass没有构造函数,也没有需要构造的数据成员?在这种情况下,编译器无论如何都不会进行任何初始化。所以只需使用新的。

如果MyClass确实有一个构造函数,那么你应该考虑它为什么在你说的时候不需要初始化。

如果MyClass确实有数据成员需要构造(一std::string说)然后我会查询您的断言,你不需要初始化。

但是你是对的另一点,从矢量切换到数组应该为你节省一些时间。

+0

你确定?基本上我的类包含一个指针和两个整数。我相信整数始终是零初始化的。实际上,使用新的MyClass [256]会使应用程序比使用丑陋的static_cast (:: operator new(sizeof)要慢5%(实际上,它只是一个结构) – galinette

+0

(MyClass [256]))),我可以找到的唯一原因是在第一种情况下进行初始化 – galinette

+1

@galinette您是否正在使用完全优化和发布模式进行编译?例如,Visual Studio在调试模式下初始化所有内容。 –

相关问题