使用模板是否可以节省内存

时间:2015-05-14 16:04:11

标签: c++ templates

在我的理解中,模板允许我们编写一个适用于不同数据类型的函数或类。

堆栈或链接列表等容器用于存储数据,但一次可以存储一种类型的数据。要存储不同类型的数据,我们需要编写同一容器类的不同版本。我们可以通过编写类模板来保存这些重复的代码。

我知道它可以节省程序员的写作工作。但我想知道使用模板是否可以节省内存。

5 个答案:

答案 0 :(得分:2)

这取决于您编写的模板。首先,如果模板在每种数据类型上创建实例都会浪费内存。简单地说,由模板实例化生成的代码将占用每个实例的程序空间。拥有这样的模板与手工编写每个实例相同。

另一方面,如果给定数据类型的每个实例的代码始终相同,则可以对模板进行大量优化。想想像vector这样的容器模板,它存储指向任何类型的指针。为什么我们需要额外的代码来存储指向int的指针而不是指向float的指针?看一下vector的stl实现,并寻找指针类型的特化。指针的矢量模板的所有实例都来自一个!基类,它实现了指针所需的所有功能。它通常使用void指针。

给定数据类型的实例将创建的唯一代码是具体指针类型的强制转换。但是演员表不会生成任何处理器可执行代码,因此无需任何程序空间成本即可完成。

还有大量的模板可以在编译期间进行操作。这称为元模板编程。这个模板通常根本不生成任何代码,并且不需要任何程序空间成本。

简而言之:您必须记住这3种类型的模板代码才能得到答案。

答案 1 :(得分:0)

您的源文件将包含更少的代码。但是,具有具体类型的模板实例的可执行文件/二进制文件可能不会。

答案 2 :(得分:0)

每次填写编译器未使用的模板变量或其组合时,编译器将实例化该模板的所有代码。这可能会导致相当大的可执行文件,在某些情况下根本不需要,例如,如果您正在使用嵌入式处理器。并非所有人都在使用内存量巨大的电脑。

有效的过程称为代码膨胀。有时,当您使用STL时,生成的代码量比您预期的要多得多。 STL容器有相当多的代码,有容器,但也有迭代器等等。

因为模板类基于头文件,所以每个方法都是内联的。编译器将对所有这些做什么取决于但最终结果是使用大量模板类可能会破坏代码的大小。

这对您来说可能不是问题,例如,如果您正在编写将在PC上运行的软件,那么这可能不会产生问题。但我正在用C ++编写嵌入式软件,但允许使用模板,但由于对代码大小有影响而严重不鼓励。

有一些方法可以通过使用OO技术来最小化代码膨胀,例如,不是为每种类型创建向量,而是可以为基类型创建向量。尽可能多地将功能推送到模板类派生自的基类,依此类推。这需要一些经验。

值得一提的另一件事是,当您使用模板时,如果代码出现问题,编译器会倾向于创建大错误消息。没有模板经验的人很难解释此错误消息。

答案 3 :(得分:0)

  

我知道它可以节省程序员的写作工作量。但我想知道使用模板是否可以节省内存。

这完全取决于你如何使用它们......

它不会自动减少可执行文件大小或RAM内存,您可以将模板视为某种预处理器,它可以从某个模板生成类,这样您就可以在更高的抽象级别上工作。以这种方式创建的类(或函数)稍后会被编译,就像您已经将它们写成自己一样。因此它减少了可见的源代码大小。

您可以使用模板元编程在编译时计算内容,因此这样的使用可能会减少可执行文件的大小。

模板还可以增加可执行文件大小,其调用代码膨胀。您可以在此处找到:How does template cause the code bloat in C++?C++ Templates: Convincing self against code bloat。但是现代编译器/链接器优化很难判断。

答案 4 :(得分:-1)

你在谈论什么样的记忆?程序空间?变量?

模板不保存可执行空间。无论您是否使用模板,都将占用可执行空间。如果您编写与模板相同的代码,但每次更改数据类型,则不会保存代码空间,它是等效的。

模板的一个优点是节省开发时间。目前,计算机拥有更多的内存空间,因此不再是问题。另一个问题是开发时间。如果您可以使用模板生成代码,那么您将节省大部分开发时间。这可以减少开发成本并缩短产品上市时间。你可以越快地获得一个项目,你就能越早获得资金并收回开发中的资金。

std::list为例。您现在可以通过提供数据类型来获得链接列表。无需再写一份副本。无需调试副本。

所以不要担心代码膨胀。更多地担心开发时间和软件质量。