gpt4 book ai didi

c++ - 为什么在分配给 const std::string 时复制字符串文字?

转载 作者:行者123 更新时间:2023-11-30 04:55:08 35 4
gpt4 key购买 nike

根据 cppreference.com ,当 const std::string 从输入 const char* 构造时(例如 const std::string("some literal");),C 字符串的拷贝 存储在 std::string 中。

我正在尝试了解在输入 C 字符串是字符串文字的情况下是否(以及为什么)特别需要拷贝。我认为 std::string 可以简单地引用字符串文字而不是创建拷贝,这样下面的代码只会创建一次 "some literal"

std::string str1("some literal");
std::string str2("some literal");

当然,对不是字符串文字的 C 字符串执行复制是明智的,因为它允许 std::string 管理它引用的数据的生命周期。但是,这对于字符串文字来说不是问题,因为它们在程序的整个生命周期内都存在。

此外,由于我们讨论的是 const 字符串,我们不必担心底层数据在程序中被更改并破坏 std::string 的值语义嗯,至少只要不使用 const_cast,但是使用 const_cast 无论如何都是自找麻烦,所以我不太担心这种情况。

那么,编译器是否有任何理由无法优化这种情况,使 const std::string 引用 const char* 而不是创建拷贝?或者,如果 cppreference 链接不正确,并且此优化实际上由某些编译器实现,哪些编译器支持此?

为了这个问题,我们假设字符串文字足够长,小字符串优化不会成为一个因素。

最佳答案

在您的示例中,std::string 只是接收一个指针,它无法知道该指针实际指向的内存类型。

指针被声明为指向 const 数据的事实无关紧要。指向非常量数据的指针可以分配给指向常量数据的指针(创建对其他可写数据的只读访问)。

std::string 根本无法知道给定的指针指向字符串文字。指针可以很容易地指向调用堆栈上的数组,或指向使用 new 分配的内存块,或指向外部库拥有的内存。

窄字符串文字没有什么特别之处,它不是 std::string 可以调整其行为的某种魔法类型。它只是一个普通的 const char[],其内存由编译器/链接器设置。它衰减为 const char *

所以 std::string 在缺乏原始信息的情况下做了它能做的唯一理智和安全的事情——复制数据。

这也使实现变得简单 - std::string 始终拥有它持有的数据。

如果你想要一个不拥有数据的类似字符串的容器,只需指向它,然后查看 C++17 的 std::string_view , 或 boost::string view对于早期的编译器。

关于c++ - 为什么在分配给 const std::string 时复制字符串文字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53218788/

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