2

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

地图文件样本

4

1 回答 1

3

泛型(C++ 中的“模板”)对于任何类型安全的语言来说都是一个巨大的胜利:

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

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

泛型编程的优点是

  • 代码可重用性
  • 避免函数重载
  • 一旦编写,它可以用于多次和案例。

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

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

这就是“胜利”。

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

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

于 2021-07-20T15:33:51.450 回答