stoi(char*)一定要构造一个临时字符串吗
Does stoi(char*) necessarily construct a temporary string?
用(以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
。
相关文章:
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 如何检查一个c++字符串中有多少相同的字符/数字
- 获取用C/C++打印的最后一个字符串
- cin >> int 给定一个字符串将 int 赋值为 0
- 我如何通过引用将 c++ 字符串分配给另一个字符串
- 使用另一个字符串从字符串中删除空格
- 有没有办法使用 strcpy 将字符串数组复制到另一个字符串或其他数组中?
- 当分配一个字符串值并稍后通过分配另一个值进行更改时C++如何管理内存?
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- C++为 void 指针分配一个字符串
- 如何在使用 getch 后在另一个字符串的末尾连接一个字符串
- 给定一个单词数组和一个字符串,如何计算给定字符串中的所有单词
- 如何在另一个字符串的x位置插入一个字符串?
- 有没有办法我可以在 C++ 中使用 if 语句来说明如果一个字符串不是两个名称的 eqal,它会给出一个输出,ATM i
- 在另一个字符串中插入文件扩展名之前的字符串
- 我有一个返回字符串向量的函数.它需要两个字符串,并且返回一个字符串中缺少的字符串
- C++自定义流操纵器,用于更改流上的下一个字符串
- 从类返回一个字符串 — 奇怪的行为
- 从我的2d数组中的一列返回的字符串值被压缩为一个字符串(在Mac os上打开Windows txt文件)
- 你能从"volatile const char*"构造一个字符串吗?(不使用`const_cast`