大量使用移动平台模板

Dav*_*ton 11 c++ mobile templates

我一直在翻阅Andrei Alexandrescu撰写的现代C++设计书,这看起来很有趣.然而,它非常广泛地使用模板,我想知道如果因为尺寸考虑使用C++进行移动平台开发(Brew MP,WebOS,iOS等),是否应该避免这种情况.

在Symbian OS C++中,不鼓励标准使用模板,Symbian操作系统本身使用它们,但使用称为精简模板的习惯用法,其中底层实现以C风格完成,使用带有薄模板的void*指针在其上方分层实现类型安全.他们使用这个习惯用语而不是经常使用模板的原因是为了避免代码膨胀.

那么在开发移动平台应用程序时使用模板的意见(或事实)是什么呢?

Kri*_*son 9

继续使用模板,只要它们使代码更容易理解和维护.在移动平台上避免模板可以归类为"过早优化".

如果遇到可执行文件大小的问题,那么必要时重新设计,但不要假设模板在看到任何实际问题之前会导致问题.

"现代C++设计"和类似书籍中的许多内容都不会导致代码膨胀,因为其中很多内容实际上是为了确保类型安全并进行编译时元编程魔术,而不是生成代码.

模板可用于执行许多不同的操作.它们可以生成比您预期更多的代码,但这并不是禁止使用它们的理由.不久之前,由于担心代码大小和性能,各个权威机构建议避免异常,虚函数,浮点数学甚至类,但人们做了这些事情,并且不知何故一切都很好.


jal*_*alf 6

模板不一定会导致代码膨胀.如果你写一个函数或类模板并创建实例为十几个不同的类型,然后是的,你得到了很多的产生重复的代码(大概,反正,一些编译器可以合并相同的实例一起回来).

但是,如果仅为一种类型实例化模板,则代码大小的成本为零.如果你实例化它几次,你支付一定的费用,但如果你用其他任何方法来实现同样的事情,你也最终会付钱.动态多态(虚函数和继承)也不是免费的.您需要根据vtable,生成的代码来支付所需的所有类型转换和转换,并且仅仅因为无法内联或优化的代码.

std::vector为例,那么是的,如果你同时使用vector<int>vector<float>,你得到的两个副本的一些代码.但是使用模板,只会编译实际使用的代码.你永远不会调用成员函数不会产生任何代码,即使在功能编译,编译器可能能够消除大量的代码.例如,对于某些类型,异常处理代码可能是不必要的,因此编译器可以消除它,产生比使用动态多态性更小的代码,其中编译器将无法对存储的类型做出任何假设.因此,在这个制造的例子,你会得到一些对两者生成的代码vector<int>vector<float>,但他们每个人会比一个多态矢量小了很多,你可能会发现在Java中,例如.

使用模板的主要问题是它需要一个支持它的编译器.在PC上,这没问题.在任何其他具有成熟C++编译器的平台上,都没问题.

但并非所有平台都有现代化的重型C++编译器.有的不支持一些先进的功能,有的只是不够好,以使模板代码工作所需的优化(模板往往需要大量的内联的,例如).所以在某些平台上,最好避免使用模板.不是因为对代码大小的任何顾虑,而是因为编译器可能无法处理它.

  • 除了在这种情况下,我们不是在谈论“不会发生的代码消除”,而是在谈论“一开始就不会生成的代码”。该标准保证在实例化模板之前不会实例化它们。试图实例化未调用的模板代码的编译器(例如,类模板中的每个函数,而不只是所使用的那些函数)可能会遇到编译错误并拒绝您完全有效的C ++程序。编译器为从未实例化的模板生成代码将是一个错误。 (2认同)

peo*_*oro 2

根据我个人的经验,使用(甚至滥用)模板很少会导致大量代码膨胀,并且使用 进行编译-Os将有很大帮助。

巨大的模板类被重复(实例化)多次的情况并不常见,因为很少有类是巨大的,而且在大多数情况下,您只用几个不同的参数实例化模板,而不是数百个。此外,在最大的模板类/函数中重用一些通用代码很容易,编译器将帮助您做到这一点。

通常数据的大小(图形、音频……)比代码大几个数量级。所以我不会担心。

当然,我所说的可能会有例外,但我想它们主要是关于高级特殊/奇怪/复杂)的东西,而不是最常见的日常课程。

总结我的建议:尽可能多地使用模板,如果出现问题,您会通过分析发现问题,并且可以轻松优化大小。