【发布时间】:2016-04-25 11:15:38
【问题描述】:
我有一个类,它包装了一个大字节数组,这些字节是网络数据包。该类实现了一个队列并提供(除其他外)front() 函数,该函数返回构成队列中最旧数据包的 const 字节向量。
class Buffer{
unsigned char data[65536];
unsigned int offset;
unsigned int length;
[...]//other fields for maintaining write ptr etc.
public:
const std::vector<unsigned char> front(){
return std::vector<unsigned char>(data + offset, data + offset + length);
}
//other methods for accessing the queue like
//pop(), push(), clean() and so forth...
[...]
}
front() 函数的上述实现的性能受到从当前数据包占用的范围内不必要的复制字节的影响。由于向量是常量,因此不需要复制数据。我想要的是在已经存储在缓冲区中的数据上创建一个向量。当然向量的析构函数不应该释放内存。
【问题讨论】:
-
你打算如何使用
front()函数?也许声明两个返回 const 迭代器的函数会更好:std::vector<unsigned char>::const_iterator front_begin() const和front_end()? -
您真的需要返回
std::vector吗?你不能把一个视图返回到缓冲区吗? -
事实上,目前我有两个函数:readPtr() 返回数据 + 偏移量和 front() 只返回长度。我只是想通过返回一个向量来简化它,所以通过调用 front() 用户将得到一切。
-
你也许可以使用 std::vector 来做到这一点,并带有一些可怕的分配器魔法。向量想要分配内存、释放内存、设置自己的大小以及(在它的一些构造函数中)复制数据。您可以使用自定义分配器停止释放,并且您可以(我认为?)安全地伪造您选择的内存位置的“分配”,也可以使用分配器。您可能可以通过使用不将任何项目放入向量中的构造函数来防止复制(我猜默认的可能有效)。我不知道你会如何处理大小的设置......
-
哦等等,也许分配器的构造方法可以不初始化向量元素?然后你可以使用一个大小设置的构造函数,或者vector::resize,也许吧?哈哈,在大多数情况下,尝试这些事情是很愚蠢的。您可能不应该为此使用 std::vector。
标签: c++ vector stdvector allocator placement-new