这是一个非常简单的问题,但我发现它很棘手。我想将char*
视为std::string
,例如:
char *p = ...; // read a huge chuck from a file
std::string s(p); // this is not what I want
所以,如果我使用构造函数,我会获得p的副本,这会浪费内存和时间。有可能以某种方式避免这种情况,并将“{em>分配”std::string
内容添加到预先存在的地址吗?
欢迎任何其他想法!
谢谢!
答案 0 :(得分:13)
是否有可能以某种方式避免这种情况,并且“将<{em}”内容{/ 1}}分配给预先存在的地址?
没有
但是,您可以将其指定给std::string_view
。展望未来,std::string
除了拥有内存之外的所有用途都应替换为std::string
。
答案 1 :(得分:2)
std::string
没有且不可能支持此功能,因为它拥有字符串缓冲区。
这意味着它最终必须释放内存,或者在将字符串更改为具有不同长度的情况下重新分配内存。如果不是更早,那么当程序退出时它必须这样做。
现在,string
应该通过指针得到一些未知的内存块?这个内存是在堆上还是在堆栈上分配的,或者是数据段中的只读内存?没有string
可能做的任何事情都是有效的,并且不会泄漏或导致在一种或另一种情况下崩溃。
答案 2 :(得分:1)
不,因为std::string
通常期望超过char*
可以提供,最明显的是将存储重新分配到完全不同的内存位置。另外,std::string
不能保证以空值终止,它只提供begin()
和end()
。
但请注意std::string
和char[]
有相当常见的界面:
chars
,std::begin
和std::end
并获取随机访问迭代器,以便像sort
这样的算法可以自由地对它们进行操作。这是C ++标准模板库的核心 - 容器和算法是分开的,同一算法可以在std::string
和char[]
上运行。
当然char*
不是char[]
,但char*
的OTOH 对看起来与begin(char[])
和{{1}完全相同这样就足以让你将它连接到以随机访问迭代器为工作的STL实用程序。
答案 3 :(得分:1)
否广泛传播的std::string
实施不会实现此类功能。即使使用placement new()
,因为内部成员可以从一个实现更改为另一个实现,或者从一个版本更改为另一个版本,或者取决于某些#define
...还可以选择提供您自己的RFA_string
from Reuters Foundation API 1}}分配器,但这似乎不是处理这类问题的方法......
是某些std::string
实施允许缓冲区重用为initializing std::string from char* without copy。
这个想法已经在其他一些问题/答案上得到了处理:
答案 4 :(得分:-2)
为什么不使用std::vector<char>
?例如:
std::vector<char> data;
data.resize( size ); // resize this to how much you need
char* p = &data[0];
// now you have a pointer to the internal data in std::vector