stoi(char*)一定要构造一个临时字符串吗

Does stoi(char*) necessarily construct a temporary string?

本文关键字:一个 字符串 char stoi      更新时间:2024-09-28

用(以NULL结尾的(char*调用stoi是否一定会构造临时string,从而导致性能损失?

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

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

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

std::strtol

std::strtoll

如果你的编译器没有进行优化,并且(通过分析(字符串副本是一个瓶颈,那么如上所述手动滚动备选方案。

根据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对象。当然,编译器可以进行优化。如果你看一下这个用-O3编译的小程序的汇编,你会在main中看到一个call strtol。这意味着编译器确实已经完全优化了stoi

相关文章: