【问题标题】:Does stoi(char*) necessarily construct a temporary string?stoi(char*) 是否必须构造一个临时字符串?
【发布时间】:2021-08-07 09:54:23
【问题描述】:

使用(NULL 终止)char* 调用 stoi 是否一定会构造一个临时的 string 并因此导致性能损失?

【问题讨论】:

    标签: c++ string performance stl


    【解决方案1】:

    根据cppreference,这些是stoi 的以下重载:

    int       stoi( const std::string& str, std::size_t* pos = 0, int base = 10 );
    int       stoi( const std::wstring& str, std::size_t* pos = 0, int base = 10 );
    

    因此,由于没有采用const char * 的重载,除非编译器进行一些优化,是的,如果您输入const char *,它将创建一个临时的std::string 对象。当然,编译器可以做优化。如果您查看the assembly of this small program compiled with -O3,您会在main 中看到call strtol。这意味着编译器确实已经完全优化了stoi

    【讨论】:

      【解决方案2】:

      从概念上讲是的。没有将const char* 作为参数的std::stoi 重载,因此创建了一个匿名临时std::string

      这确实是一个字符串副本。

      您可以检查汇编代码,看看您的编译器是否这样做。它可能会优化到

      std::strtol
      

      std::strtoll
      

      如果您的编译器没有进行该优化,并且(通过分析)证明字符串副本是一个瓶颈,则按照上面的方法手动滚动替代方案。

      【讨论】:

        猜你喜欢
        • 2017-02-10
        • 1970-01-01
        • 1970-01-01
        • 2015-05-29
        • 2013-02-04
        • 2016-11-29
        • 2023-03-05
        • 2012-03-04
        • 1970-01-01
        相关资源
        最近更新 更多