std::sort排序失效:修改XMRIG Proxy源码实现Worker按字母排序失败
XMRIG Proxy Worker列表排序失效问题修复
问题背景
修改XMRIG Proxy源码,希望在xmrig::Workers::printWorkers方法中让Worker列表按字母顺序打印。已尝试复制m_workers到临时容器pr_workers,调用std::sort并以Worker::name()作为排序依据,但排序功能未生效。
相关代码片段:
auto pr_workers=m_workers; std::sort(pr_workers.begin(), pr_workers.end(), [](const Worker a, const Worker b) { return a.name() < b.name(); });
完整printWorkers方法代码:
void xmrig::Workers::printWorkers() { if (!isEnabled()) { LOG_ERR("Per worker statistics disabled"); return; } char workerName[24] = { 0 }; size_t size = 0; Log::print(WHITE_BOLD_S "%-23s | %-15s | %-5s | %-8s | %-3s | %11s | %11s |", "WORKER NAME", "LAST IP", "COUNT", "ACCEPTED", "REJ", "10 MINUTES", "24 HOURS"); auto pr_workers=m_workers; std::sort(pr_workers.begin(), pr_workers.end(), [](const Worker a, const Worker b) { return a.name() < b.name(); }); for (const Worker &worker : pr_workers) { const char *name = worker.name(); size = strlen(name); if (size > sizeof(workerName) - 1) { if (m_mode == Agent) { memcpy(workerName, name, 20); memcpy(workerName + 20, "...", 3); } else { memcpy(workerName, name, 6); memcpy(workerName + 6, "...", 3); memcpy(workerName + 9, name + size - sizeof(workerName) + 10, sizeof(workerName) - 10); } } else { strncpy(workerName, name, sizeof(workerName) - 1); } Log::print("%-23s | %-15s | %5" PRIu64 " | %8" PRIu64 " | %3" PRIu64 " | %6.2f kH/s | %6.2f kH/s |", workerName, worker.ip(), worker.connections(), worker.accepted(), worker.rejected(), worker.hashrate(600), worker.hashrate(86400)); } }
问题原因
排序逻辑存在两个关键问题:
- C风格字符串比较错误:
Worker::name()返回的是const char*类型,直接使用<运算符比较的是指针的内存地址,而非字符串的字典序,导致排序逻辑完全不符合预期。 - 不必要的拷贝:lambda表达式中使用值传递
const Worker a, const Worker b,会触发Worker对象的拷贝构造,不仅效率低下,还可能因拷贝行为导致意外问题。
修复方案
修改排序的lambda表达式,修正字符串比较逻辑并使用引用传递参数:
方案1:使用std::strcmp比较C风格字符串
auto pr_workers = m_workers; std::sort(pr_workers.begin(), pr_workers.end(), [](const Worker& a, const Worker& b) { // std::strcmp返回值<0表示a的名字字典序小于b return std::strcmp(a.name(), b.name()) < 0; });
方案2:转换为std::string后比较(可读性更好)
auto pr_workers = m_workers; std::sort(pr_workers.begin(), pr_workers.end(), [](const Worker& a, const Worker& b) { return std::string(a.name()) < std::string(b.name()); });
验证说明
修改后重新编译XMRIG Proxy,调用Worker列表打印功能时,Worker将按照名称的字典序(字母顺序)排列输出。
内容的提问来源于stack exchange,提问作者aeon
相关产品推荐
相关产品推荐

