我是一名C程序员,尝试编写C++代码。听说C++中的string
相较于char*
在安全性、性能等方面更优秀,但有时候似乎char*
是一个更好的选择。有人建议程序员在C++中不应使用char*
,因为我们可以使用string
完成char*
的所有功能,并且更加安全和快速。
您曾经在C++中使用过char*
吗?在具体的什么情况下使用呢?
使用 std::string
更加安全,因为您不需要担心为字符串分配/释放内存。C++ 的 std::string
类可能在内部使用 char*
数组。然而,该类将为您管理内部数组的分配、重新分配和释放。这消除了使用原始指针所伴随的所有常见风险,如内存泄漏、缓冲区溢出等。
此外,它也非常方便。您可以复制字符串、追加字符串等,而无需手动提供缓冲区空间或使用如strcpy/strcat之类的函数。使用 std::string 就像使用=
或+
运算符一样简单。
基本上,就是:
std::string s1 = "Hello ";
std::string s2 = s1 + "World";
对比...
const char* s1 = "Hello";
char s2[1024]; // How much should I really even allocate here?
strcpy(s2, s1);
strcat(s2, " World ");
编辑:
针对您关于在C++中使用char*
的编辑:许多C++程序员会认为,除非您正在使用某些需要它的API /遗留函数,否则您永远不应该使用char*
,在这种情况下,您可以使用std::string :: c_str()
函数将std::string
转换为const char *
。
但是,我认为在C ++中有一些合法使用C数组的方法。例如,如果性能绝对关键,则堆栈上的小型C数组可能比std::string
更好。您还可能编写需要绝对控制内存分配/释放的程序,在这种情况下,您将使用char*
。 此外,正如评论部分所指出的那样,std::string
不能保证为您提供可写连续的缓冲区*,因此,如果您的程序需要完全可移植,您无法直接从文件中写入std::string
。但是,如果您需要这样做,std::vector
仍然可能比使用原始C数组更可取。
* 虽然在C++11中已更改了这一点,以便std::string
提供连续的缓冲区
好的,自我回答以来问题已经有了很大变化。
与std::string相比,本地字符数组在内存管理和缓冲区溢出方面是一场噩梦。 我总是更喜欢使用std::string。
尽管在某些情况下由于性能限制(尽管std::string在某些情况下可能实际上更快 - 先测量!)或在嵌入式环境中禁止使用动态内存等原因,字符数组可能是更好的选择。
C语言的char *字符串不能包含'\0'字符。C++的string可以轻松处理空字符。如果用户输入包含\0的字符串,而你使用C字符串,你的代码可能会失败。这也存在安全问题。
'\0'
。 - phuclvstd::string
的实现将内存使用信息隐藏起来,如果你在编写性能关键的代码,或者确实需要担心内存碎片问题,那么使用 char* 可以避免很多麻烦。
但对于其他情况来说,std::string
将所有这些信息都隐藏起来,使得它更加易用。
从性能角度来看,std::string实际上可能更好。此外,还有无数其他原因 - 安全性、内存管理、方便的字符串函数,使std::string成为一个无限好的选择。
编辑:要了解为什么std::string可能更有效率,请阅读Herb Sutter的书籍 - 他讨论了一种将惰性初始化与引用相结合来内部实现字符串的方法。
使用 std::string
,因为它具有令人难以置信的便利性——自动内存处理和方法/运算符。通过一些字符串操作,大多数实现都会进行优化(例如延迟评估几个后续操作——节省内存复制)。
如果您需要依赖于内存中特定的字符布局进行其他优化,请尝试使用 std::vector<char>
。如果您有一个非空向量 vec
,则可以使用 &vec[0]
获取 char*
指针(向量必须是非空的)。
比较并对比以下C和C++示例:
strlen(infinitelengthstring)
对比
string.length()
std::string::c_str()
)是相当简单的事情。 - sbi