基本上,如果一個人有一個空終止字串的預加載緩沖區和要參考的長度,并且想要將對它的參考傳遞給一個采用 std::string & 但不復制字串或擁有它的方法,是嗎?有可能嗎?
這只會有一個有限的生命周期,它的管理方式是它只在緩沖區有效時才有效。
uj5u.com熱心網友回復:
有沒有辦法制作一個參考外部提供的緩沖區但不擁有它的 std::string ?
不。
您有以下選擇:
- 首先
std::string用作“外部”緩沖區。 - 將外部緩沖區復制到字串中。
- 不要使用 (reference to)
std::string作為引數。std::string_view是一個典型的不錯的選擇。但是,創建非空終止字串視圖非常容易,并且您的前提明確宣告空終止。如果這很重要,那么您可能需要避免使用字串視圖。- 如果字串視圖不合適,那么您可以使用
const char*指向以空字符結尾的字串。
uj5u.com熱心網友回復:
基本上,對于非擁有字串,答案是否定的。
但是,如果非擁有標準不是那么重要,您可以做的是使用自己的分配器來參考特定的緩沖區。
您還可以做的是使用std::pmr::string允許您提供自定義memory_resource.
思路如下:
#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不斷增長的物件。這意味著釋放是一種“無操作”。
這種東西的好處是你可以把同樣的東西給 a std::pmr::vector。
但是,您可能要注意以下幾點:
std::pmr::string使用char. 由于它是一個微不足道的物件,我認為(雖然我不確定)在字串被破壞后訪問緩沖存盤器是安全的。如果它是一種不可輕易破壞的型別,我認為可能會看到垃圾值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/434532.html
上一篇:(VisualBasic)如何將字串值拆分為字串陣列?
下一篇:替換不相等的嵌套串列中的字串
