基本上,如果有一个预加载了空终止字符串的缓冲区和要引用的长度,并且想将其引用传递到一个接受std::string&但不复制字符串或拥有它的方法中,是否可以这样做?
这只会有一个有限的生命周期,管理方式是只在缓冲区有效时才有效。
std::string
的东西,所以没问题。 - Calethstd::string
也是以 null 终止的。 - eerorika#include <string>
#include <memory_resource>
#include <array>
#include <utility>
#include <iostream>
template<std::size_t size>
class StackBufferResource {
public:
auto as_resource() {return &m_resource;}
auto address() {return m_buffer.data();}
private:
std::array<std::byte, size> m_buffer{};
std::pmr::monotonic_buffer_resource m_resource{m_buffer.data(), size};
};
int main() {
StackBufferResource<512> buffer;
std::pmr::string myString("My name is Antoine and I am not sure for this answer", buffer.as_resource());
std::cout << myString << "\n";
std::cout << (const char*)buffer.address() << std::endl;
}
std::pmr::monotonic_buffer_resource
是一个不断增长的memory_resource
对象。这意味着解除分配操作是一种“无操作”。
这样的好处在于,你可以将相同的东西给一个std::pmr::vector
。
但是,请注意以下几点:
std::pmr::string
使用char
。由于它是一个平凡的对象,我认为(尽管不确定)在字符串被销毁后访问缓冲区内存是安全的。
如果它是一个非平凡析构类型,我认为可能会看到垃圾值。
std::string_view
дЅњдёєеЏ‚ж•°гЂ‚ - HolyBlackCatstring_view
。如果您无法更改正在调用的成员函数(方法不是 C++ 术语)或其接口,理论上可以创建一个从string
派生的类,并使用自己的实现。然而,在作为基类类型访问时,basic_string
中的相关函数未声明为virtual
,因此无法获得新行为。 - Sebastian