在winsock中将vector重用为数组的更有效方法?

时间:2009-03-07 08:09:25

标签: c++ stl vector winsock

我目前正在使用矢量作为c风格的数组来通过Winsock发送和接收数据。

我有一个std :: vector,我正在使用它作为我的'字节数组'。

问题是,我使用两个向量,每个发送一个,每个recv一个,但我正在做的似乎效率很低。

示例:

std::string EndBody("\r\n.\r\n");
std::fill(m_SendBuffer.begin(),m_SendBuffer.end(),0);
std::copy(EndBody.begin(),EndBody.end(),m_SendBuffer.begin());
SendData();

SendData只是调用发送适当的次数,并确保一切正常。

反正。除非我在每次使用之前将矢量归零,否则会出现重叠错误的错误。有没有更有效的方式让我做我正在做的事情?因为似乎在每次调用时将整个缓冲区清零是非常低效的。

感谢。

4 个答案:

答案 0 :(得分:1)

你可以使用m_SendBuffer.clear()

否则end()方法不知道缓冲区的实际大小是什么。

clear()不是一种非常昂贵的调用方法。除非你正在处理某些486或其他东西,否则它不会影响你的表现

答案 1 :(得分:1)

似乎其他海报正在关注清除缓冲区的成本或缓冲区的大小。然而,您并不需要清除或清除整个缓冲区,或者知道它的大小,因为您正在做什么。 '错误与东西重叠'是SendData的一个问题,你没有发布代码。据推测,SendData不知道需要发送多少缓冲区,除非其中的数据是零终止的。如果这个假设是正确的,你所要做的就是正确地终止数据。

std::copy(EndBody.begin(),EndBody.end(),m_SendBuffer.begin());
m_SendBuffer[EndBody.size()] = 0;
SendData();

答案 2 :(得分:0)

不会调用清楚意味着向量的新大小为0吗?如果OP使用向量作为大块内存,那么他们必须在清除后调用resize以确保调用send和recv的适当空间。

调用clear然后调整大小就会大致相同,只是用零填充它不会吗?

vector::clear

vector::resize

fill

答案 3 :(得分:0)

据我了解the STL docs,调用clear只是将.end()值设置为与.begin()相同,并将size设置为零,这是即时的。

它不会改变分配的内存量或内存的位置(任何迭代器显然都是无效的,但数据往往会延迟!)。正如您已经发现的那样,.capacity()不会更改,也不会存储数据。如果你总是使用.begin()。end()和STL迭代器来访问这个区域,这无关紧要。

不要忘记,除非将它们包含在初始化列表中,否则不会初始化类的方法变量。添加m_SendBuffer(BUFSIZE,0)可能会有诀窍。