VC++中的std::atoll函数

10
我一直在使用来自的std::atoll函数将字符串转换为int64_t,并使用gcc进行编译。但是,在Windows工具链(使用Visual Studio Express 2010)中似乎找不到该函数。有什么更好的替代方法吗?
我还对将strings转换为uint64_t感兴趣。整数定义取自。

看起来这个问题在VS2013中已经解决了。http://connect.microsoft.com/VisualStudio/feedback/details/752386/std-atoll-not-found - Oleg Vazhnev
5个回答

8

MSVC有_atoi64和类似的函数,可以查看这里

对于无符号64位类型,请参见_strtoui64


对于其他人而言,这似乎没有uint64_t的等效项,我转而使用int64_t(从第三方库中进行强制转换)进行操作。 - Cookie
@Cookie,添加了一个链接,用于无符号64位类型的类似函数。 - nos

5
  • use stringstreams (<sstream>)

    std::string numStr = "12344444423223";
    std::istringstream iss(numStr);
    long long num;
    iss>>num;
    
  • use boost lexical_cast (boost/lexical_cast.hpp)

     std::string numStr = "12344444423223";
     long long num = boost::lexical_cast<long long>(numStr);
    

5
您运行了性能测试并发现将字符串转换为数字是瓶颈? - Armen Tsirunyan
Valgrind告诉我,例如strtod占总时间的8%。 atol落后一点,只有4%。 实际上,我正在重新编写strtod,以消除这8%。 stringstream比atol要慢得多。 而lexical_cast则是最慢的。 大部分时间用于解析大约100兆字节的csv文件。 - Cookie
如果绝对成本可以忽略不计,那么相对成本就不重要了。你的脚本运行时间长且频繁吗?是否值得进行优化?(当然,为了学习目的这是可以的) - Sebastian Mach
3
它经常在夜间运行,通常运行时间超过24小时,在8个核心上经常不停地运行,我经常需要等待它。 20%的性能差异非常明显。这真的是重点吗?难道接受我关心性能很困难吗?或者您想在回答之前剖析我的整个项目和方法? - Cookie
你不知道strtod()在VC++上是否具有相同的性能?与std::istringstream相比,std::sscanf()可能值得进行分析。 - Clifford

2

如果您运行了性能测试,并得出结论转换是瓶颈并且需要非常快地完成,而且没有现成的函数可用,我建议您自己编写一个。 以下是一个示例,其速度非常快,但没有错误检查,并且仅处理正数。

long long convert(const char* s)
{
    long long ret = 0;
    while(s != NULL)
    {
       ret*=10; //you can get perverted and write ret = (ret << 3) + (ret << 1) 
       ret += *s++ - '0';
    }
    return ret;
}

谢谢,Armen。我可能会这样做。这与https://dev59.com/tm025IYBdhLWcg3wvIgo非常相似,只不过是针对双精度浮点数的。 - Cookie

1
你的 <cstdlib> 中是否有 strtoull?它是 C99 标准。而且 C++0x 应该也有 stoull 可以直接处理字符串。

遗憾的是,MSVC不支持C99。 - nos

1

Visual Studio 2013终于有了std::atoll


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接