CODE:
struct Stringdata
{
// Length of data in buffer.
size_t len;
// Allocated size of buffer.
size_t alc;
// Buffer.
char data[1];
};
typedef std::list<Stringdata*> Stringdata_list;
Stringdata_list strings_;
Stringdata *psd = this->strings_.front();
//...
if (len > psd->alc - psd->len)
alc = sizeof(Stringdata) + buffer_size;
else
{
char* ret = psd->data + psd->len;
memcpy(ret, s, len - sizeof(Stringpool_char));
memset(ret + len - sizeof(Stringpool_char), 0,
sizeof(Stringpool_char));
psd->len += len;
return reinterpret_cast<const Stringpool_char*>(ret);
}
在上面的代码示例中,我对else
中的操作感到困惑分支。
它是否会创建一个新元素并将其插入前面的元素或 只需在列表的第一个元素中放置一个新元素吗?
答案 0 :(得分:1)
您的代码似乎都没有。 else分支中的代码根本不会修改strings_
结构。代码只修改列表前面的元素返回。这应该对实际的列表结构没有影响。
答案 1 :(得分:0)
它不会创建新元素 - 只需将s中的数据附加到前面元素中的数据(如果有空格)。但是,编写的代码非常容易混淆。
答案 2 :(得分:0)
据我所知(你的摘录中遗漏了一些重要的代码),你有一个数据块,它本质上是一个Stringdata对象的数组,还有一个列表&lt;&gt;指向该块的指针。 else块正在扩展该数组。
使用vector<Stringdata>
而不是list<Stringdata*>