【问题标题】:Template instantiation causing function bloating模板实例化导致函数膨胀
【发布时间】:2021-07-20 14:19:06
【问题描述】:

当我开始对 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 的方式,这是为了得出这个结论而检查的地图文件样本

地图文件样本

【问题讨论】:

  • 如果您愿意,可以使用 string_view。
  • 请不要张贴文字图片,谢谢。函数模板实例化通常会导致生成二进制代码。这可能会导致二进制大小增加。在许多个月前将模板引入 C++ 时就是这种情况,并且在可预见的将来很可能会继续这种情况。至于效率,您需要衡量它在您的特定情况下的效率。 (但不要测量未经编译器优化生成的二进制文件)

标签: c++ pointers c++17 map-files template-instantiation


【解决方案1】:

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

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

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

泛型编程的优点是

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

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

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

这是一个“胜利”。

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

模板很好。但是你需要为正确的工作使用正确的工具:)

【讨论】:

    猜你喜欢
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多