【问题标题】:Is overloading int function with the same long long function has any point?用相同的 long long 函数重载 int 函数有什么意义吗?
【发布时间】:2022-01-12 23:11:25
【问题描述】:

这是一个简单的例子:

int function (int n) { 
    //code 
}

long long function (long long n) {
    //absolutely the same code but intended to work with bigger values
}

我正在考虑节省额外的内存(如果您将它与 small 类型的变量一起使用)并使其更通用(如果您将它与 big 类型的变量一起使用)

我希望你能明白我的想法 - 如果你在其中放 15 之类的东西,不要使用 long long,而是对较小的类型(如 int)使用重载。

我想我在这里遗漏了一些东西。我什至应该让这个超载吗?我能否在不为 每个现有 integer 类型(short、int、长长长长……)?

【问题讨论】:

  • 您可以使用template<typename T> T func(T n),甚至template<std::integral INT> INT func(INT n) 将其限制为整数类型
  • 15 是一个int,因此它会调用采用int 的版本。重载决议发生在编译时,参数的实际 value 是一个未考虑的运行时属性。
  • 节省额外的内存 — 它真的可以节省任何记忆吗?您需要即时分配 100 万个 T 类型的对象,还是只分配 return n*2

标签: c++ function memory overloading


【解决方案1】:

如果您正在为相当新的个人计算机或 Web 服务器编写代码,那么拥有单独的 int 版本可能是一个过早的优化,因为这些机器中的大多数都具有 64 位处理器,因此使用 64 位 long long 的计算应该很快。

OTOH,如果您正在编写一个 8/16/32 位嵌入式系统,而在该系统上 64 位运算速度非常慢,那么这可能是值得进行的速度优化。

但在内存使用方面仍然不太可能有帮助,因为重复实现一个函数会增加编译代码的大小,从而抵消使用更少内存的好处为您的变量。除非该函数采用可能是 数百万 个整数的数组,而不仅仅是一个整数,在这种情况下,数据大小比代码大小更受关注。

如果您确实坚持为不同的整数大小设置重载函数,我建议使用 Ranoietep 的建议,将其设为 template 函数,以避免源代码中的重复。

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 2021-06-25
    • 2020-04-11
    • 2011-03-03
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多