Ale*_*lke 1 qt memory-management
我正在进行循环,我想将一些字符从字符串复制到另一个字符串.我知道限制大约是20个字符所以我想在循环外执行此操作:
QString name;
name.reserve(25);
Run Code Online (Sandbox Code Playgroud)
这样我就可以填充一个缓冲区,Qt避免每次解析名称时重新分配它.只是,为了得到这个名字我做这样的事情:
for(int i(0); i < 20 && *s != '\0'; ++i)
{
name += *s;
}
Run Code Online (Sandbox Code Playgroud)
这意味着我每次都必须重置名称.我怎么能这样做,并确保每次保留的空间不会丢失?
// will reserved memory be lost after this call?
name.clear();
// would that be more likely to keep the memory buffer?
name = "";
Run Code Online (Sandbox Code Playgroud)
文档似乎没有说出这种或那种方式.
完整的循环集如下:
QString name;
name.reserve(25);
for(QChar const *s(input.data()); *s != '\0'; ++s)
{
...snip...
if(<some condition>)
{
name.clear() // losing reserved data here?
for(int i(0); i < 20 && *s != '\0'; ++i)
{
name += *s;
}
...snip...
}
...snip...
}
Run Code Online (Sandbox Code Playgroud)
通话QString::clear()将导致您的预留空间丢失.考虑以下:
QString s;
s.reserve(25);
qDebug() << "Before Clear: " << s.capacity();
s.clear();
qDebug() << "After Clear: " << s.capacity();
Run Code Online (Sandbox Code Playgroud)
输出:
Before Clear: 25
After Clear: 0
Run Code Online (Sandbox Code Playgroud)
删除字符串内容而不丢失保留空间的最有效方法是调用QString::resize():
QString s;
s.reserve(25);
qDebug() << "Before Resize: " << s.capacity();
s.resize(0);
qDebug() << "After Resize: " << s.capacity();
Run Code Online (Sandbox Code Playgroud)
输出:
Before Resize: 25
After Resize: 25
Run Code Online (Sandbox Code Playgroud)
在实现中QString::resize(),resize(0)对具有保留容量的字符串的调用相当于将内部大小值0设置为并将内部缓冲区的第一个字符设置为'\0'.