构造函数/函数重载签名查找时间复杂度?

时间:2016-08-02 19:03:27

标签: constructor compilation language-agnostic initialization overloading

我正在阅读std::string中的C++类,并注意到有很多不同的构造函数可用,为我们提供了一系列初始化功能。这让我想知道编译器如何选择在给定参数时选择哪个构造函数,或者在重载的情况下,编译器如何将函数签名与给定的参数集匹配。

如果我们在伪代码中声明了以下函数:

function f1(int numberHere) {
    //....do something
}

function f1(int numberHere, string stringHere) {
    //....do something
}

我决定拨打f1(4),显然有两个选项可供选择,但如果有10000个选项/签名怎么办?是否会按比例延长?如果是这样,需要更长的时间?编译器是否有一些偷偷摸摸的O(n)方法来索引重载,以便它可以在程序运行后在O(1)时间内调用正确的方法,或者在O(1)中编译,无论多少重载因为即时签名匹配而存在但需要更长时间才能运行完成的结果?

这个问题甚至可以得到有效回答吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

匹配功能签名实际上与任何其他搜索或查找问题没有什么不同。根据您在以下位置存储可用功能签名的数据结构,有三种基本方法:

  1. 使用未排序的列表或数组,并获得O(n)时间复杂度。
  2. 使用排序数组或树状结构并获得O(log(n))。 (您可以按第一个参数的类型排序,然后排序第二个,依此类推,假设每个类型都分配了一个整数ID。)
  3. 使用哈希映射获取O(1)。
  4. 但我怀疑在这种情况下,时间complxity有任何实际意义。它描述了n值较大的算法的渐近行为。即使n = 100,未排序的数组搜索也可能比哈希映射查找更快,因为它的开销更小。

    从可用性的角度来看,设计一个具有10次甚至100次重载功能的API是一个非常糟糕的主意。