【问题标题】:Logic for verifying major and minor version requirements?验证主要和次要版本要求的逻辑?
【发布时间】:2015-05-17 01:46:34
【问题描述】:

假设服务器需要最低客户端版本。

有主要和次要版本,例如:

1,0 1,2 2,0 2,9

给定一个函数,例如:

bool checkVersion(int minimumMajor,int minimumMinor,int clientMajor, int clientMinor) {
//TODO
}

实现会是什么样子?

逻辑基本上是

return clientMajor.clientMinor >= minimumMajor.MinimumMinor

但是用整数制作浮点数似乎效率低下。什么可能是执行此逻辑的快速方法。

谢谢

【问题讨论】:

  • C 还是 C++?它们是不同的语言。
  • 词法字符串比较不好吗?
  • @OmnipotentEntity C 或 C++ 实现没问题,只要速度快。
  • 无论做什么,都不要做词法字符串比较或浮点转换。因为它是版本比较中的常见错误。 4.10 版比 4.9 版更新
  • @Milo as long as it is fast 对于这样的字符串,您不会注意到任何区别。

标签: c++ c algorithm


【解决方案1】:

为什么不简单:

if (clientMajor > minimumMajor) return true;
else if (clientMajor == minimumMajor && clientMinor >= minimumMinor) return true;
return false;

【讨论】:

  • 这是最好的纯 C 答案。
  • @OmnipotentEntity 我们假设truefalse#defined 然后:)
  • 哈哈,完全错过了。 :)
【解决方案2】:

使用 C++ 标准库和编译器的优化。

#include <tuple>

bool checkVersion(int minimumMajor, int minimumMinor, int clientMajor, int clientMinor) {
    return std::make_tuple(clientMajor, clientMinor) >= std::make_tuple(minimumMajor, minimumMinor);
}

【讨论】:

  • 你比我多几秒钟,make_tupletie 在这种情况下编译为相同的指令并进行了全面优化。所以我撤回我的回答并支持你的回答。
  • @OmnipotentEntity 同样在这里 :) 赞成,我想知道 std::tie 在这个比较中是否更好(或更糟)。通过查看它们的定义,它们似乎表现同样出色。
  • 在您通过引用传递非平凡结构的情况下肯定会更好。想象一下minimumMajor 是一个任意精度的整数,它有几兆字节大(无论出于何种原因)。你想避免那个副本。而且编译器可能无法证明它没有副作用。
  • 哦,好的,对,make_tuple 会在这种情况下复制(除非你搬进去)。
【解决方案3】:

首先检查主要版本。如果它们相等,则检查第二个。否则,您不必为次要版本而烦恼。

或者,如果您假设主要版本永远不会超过某个数字(例如 1024),您可以这样做:

(minimumMajor*1024)+minimumMinor < (clientMajor*1024)+clientMinor

或者,甚至更有效:

(minimumMajor<<10)+minimumMinor < (clientMajor*1024)+clientMinor

【讨论】:

  • minimumMajor*1024minimumMajor&lt;&lt;10 将在任何体面的编译器上编译为相同的指令......(以及最糟糕的编译器)
猜你喜欢
  • 2018-08-13
  • 2012-10-11
  • 2013-09-22
  • 1970-01-01
  • 2017-04-22
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
相关资源
最近更新 更多