【发布时间】:2021-08-07 09:54:23
【问题描述】:
使用(NULL 终止)char* 调用 stoi 是否一定会构造一个临时的 string 并因此导致性能损失?
【问题讨论】:
标签: c++ string performance stl
使用(NULL 终止)char* 调用 stoi 是否一定会构造一个临时的 string 并因此导致性能损失?
【问题讨论】:
标签: c++ string performance stl
根据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。
【讨论】:
从概念上讲是的。没有将const char* 作为参数的std::stoi 重载,因此创建了一个匿名临时std::string。
这确实是一个字符串副本。
您可以检查汇编代码,看看您的编译器是否这样做。它可能会优化到
std::strtol
或
std::strtoll
如果您的编译器没有进行该优化,并且(通过分析)证明字符串副本是一个瓶颈,则按照上面的方法手动滚动替代方案。
【讨论】: