我想知道如何在普通 C++ 字符串中预分配和初始化字符序列。这个问题的场合是查询 Windows 注册表的值。有关一些示例代码,请参阅此答案。问题是系统调用写入了调用者分配的数组。我已经解决了分配缓冲区的直接问题,但是这个解决方案似乎是一个无关的字符串副本。这让我对一个更针对图书馆作者的一般性问题感到好奇,关于如何消除额外操作的问题。
的构造函数std::basic_string
不包括这样做的明显方法。在许多方面,我希望有一个带有std::unique_ptr
参数的字符串构造函数,该参数吸收指针后面的分配作为其内部存储。我正在考虑类似这样的示例代码:
size_t len;
// ... Determine len
std::string::allocator_type a = std::string::allocator_type();
std::unique_ptr< char_t[] > p( a.allocate( len ) );
// ... Copy characters to p
std::string s( p, len, a ); // constant-time constructor
这不起作用,因为没有这样的构造函数。问题是如何实现这样的构造函数。
似乎正确的方法是定义一个自定义分配器,其allocate
函数返回预分配的存储并且只执行一次。大概这个类本身是通用的,用字符串分配器实例化(如示例中所示)。这似乎可行,但我确信我不理解这种方法的所有后果。