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
。
使用(以 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
。