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

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

使用(以 NULL 结尾的)char* 调用 stoi 是否一定会构造一个临时的 string 并因此导致性能下降?

理论上是的。 std::stoi 没有以 const char* 作为参数的重载,因此创建了一个匿名临时 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目的。当然,编译器可以做优化。如果您查看 the assembly of this small program compiled with -O3,您会在 main 中看到一个 call strtol。这意味着编译器确实已经完全优化了 stoi