gpt4 book ai didi

c++ - 避开 CRT

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:00:11 27 4
gpt4 key购买 nike

在编写 C++ 应用程序时,我通常会限制自己使用 C++ 特定的语言功能。这主要意味着尽可能使用 STL 而不是 CRT。

对我来说,STL 比使用 CRT 更流畅且更易于维护。请考虑以下事项:

std::string str( "Hello" );
if( str == "Hello" ) { ... }

C-Runtime 等价物是:

char const* str = "Hello";
if( strcmp( str, "Hello" ) == 0 ) { ... }

我个人觉得前一个例子更容易看。我更清楚发生了什么。当我编写第一遍代码时,我的第一件事总是以最自然的方式编写代码。

我的团队对前一个示例的一个担忧是动态分配。如果字符串是静态的或者已经在别处分配,他们认为可能导致碎片或在这里浪费分配是没有意义的。我反对的观点是,首先以最自然的方式编写代码,然后在证明代码导致问题后返回并更改它。

我不喜欢后一个示例的另一个原因是它使用了 C 库。通常我会不惜一切代价避免使用它,因为它不是 C++,它的可读性较差,更容易出错,而且存在更多安全风险。

所以我的问题是,避免使用 C 运行时是否正确?我真的应该关心编码这一步的额外分配吗?在这种情况下,我很难判断我是对还是错。

最佳答案

我觉得我对 llvm::StringRef 的评论被忽略了,所以我会从中得出答案。

llvm::StringRef str("Hello");

这实质上是设置一个指针,调用 strlen,然后设置另一个指针。没有分配。

if (str == "Hello") { do_something(); }

可读,还是没有分配。它也适用于 std::string

std::string str("Hello");
llvm::StringRef stref(str);

尽管如此,您必须小心,因为如果字符串被销毁或重新分配,StringRef 将变得无效。

if (str == stref) { do_something(); }

在适当的地方使用这个类时,我注意到相当可观的性能优势。这是一个强大的工具,您只需要小心使用即可。我发现它对字符串文字最有用,因为它们保证在程序的生命周期内持续存在。另一个很酷的功能是您可以在不创建新字符串的情况下获取子字符串。

顺便说一句,有人提议将与此类似的类添加到标准库中。

关于c++ - 避开 CRT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10724690/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com