微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

模板实例化导致函数膨胀

如何解决模板实例化导致函数膨胀

当我开始对 C++1x 特性进行更深入的试验时,我遇到了一些想法。例如,当有这个构造时 template<unsigned int N> unsigned int functionForTest(const char (&a)[N]); 以及它的用法

functionForTest("Hello"); ---> const char [6]

functionForTest("Hello World") ---> const char [12];

然后 c++ 最终实例化了具有 2 个不同参数类型的 2 个函数,这意味着如果该函数以不同的大小使用,则二进制大小会增加。那效率如何?它是编译器特定的吗?传统的类似 C 的数组和大小传递到函数这里不是更有效吗?

这就是我构建 g++ -std=c++17 -Xlinker -Map=output.map compilerDiffs.cpp -o test.exe 的方式,这是为了得出这个结论而检查的地图文件样本

地图文件示例

解决方法

泛型(C++ 中的“模板”)是任何类型安全语言的巨大胜利:

https://www.geeksforgeeks.org/generics-in-c/

简单的想法是将数据类型作为参数传递,这样我们就不会 需要为不同的数据类型编写相同的代码。例如,一个 软件公司可能需要 sort() 用于不同的数据类型。而不是 编写和维护多个代码,我们可以编写一个 sort() 并将数据类型作为参数传递。

泛型编程的优点是

  • 代码可重用性
  • 避免函数重载
  • 一旦编写,可多次使用。

是的 - 这意味着如果你为两种不同类型实例化一个模板......那么你的编译器将生成两个不同的函数。这不是“效率低下”——这就是整个POINT。您已经编写了一个“通用”函数;编译器负责其余的工作。

您不再需要为每个特定类型一遍又一遍地“重写”相同的函数。

这是一场“胜利”。

上面的问题是“模板”对于您的特定示例来说只是错误的选择。你可能想要一个“std::string”(在这种情况下不需要“N”。或者,你可能想要将“N”作为函数参数传递。

模板很好。但是您需要使用正确的工具来完成正确的工作:)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。