new
初始化指针并将数据放在那里。但是我不能使用向量,因为它们需要发送序列化,并且向量和序列化都有我不想要的开销。例如:
unsigned short data[1270], // the maximum size the operation could take is 1270 shorts
*packet; // pointer
int counter; //this is to count how big "packet" will be
//example of operation, wich of course is different from my program
// in this case the operation takes 6 bytes
while(true) {
for (int i; i != 6; i++) {
counter++;
data[i]= 1;
}
packet=new unsigned short[counter];
for (int i; i!=counter; i++) {
packet[i]=data[i];
}
}
就像你可能已经注意到的那样,这段代码是循环运行的,所以问题可能是我反复重新初始化同一指针的方法。 如果我这样做,这段代码中的问题是:
std::cout<<counter<<" "<<sizeof(packet)/sizeof(unsigned short)<<" ";
计数器的大小变化(通常从1到35),但数据包的大小始终为2.我在delete []
之前尝试了new
,但它没有解决问题。
这个问题也可能与代码的另一部分有关,但我在这里只是问:
我的方式是重复分配内存吗?
答案 0 :(得分:1)
在向请求的情况下,不断添加到std::vector
堆内存中分配的大小不超过实际需要的数量:
std::vector<int> vec;
std::size_t const maxSize = 10;
for (std::size_t i; i != maxSize; ++i)
{
vec.reserve(vec.size() + 1u);
vec.push_back(1234); // whatever you're adding
}
我应该补充说,我认为在正常情况下这样做是没有充分理由的。这个“计划”的表现可能会受到严重阻碍,没有明显的好处。
答案 1 :(得分:0)
您始终可以使用指针和realloc。 C ++是一种强大的语言,因为它的指针,你不需要使用数组。
对于您的情况,您可以像这样使用它:
new_packet = (unsigned short*) realloc (packet, new_size * sizeof(unsigned short));
if (new_packet!=NULL) {
packet = new_packet;
for(int i ; i < new_size ; i++)
packet[i] = new_values[i];
}
else {
if( packet != NULL )
free (packet);
puts ("Error (re)allocating memory");
exit (1);
}
答案 2 :(得分:0)
好的,我在这里看到了你的逻辑中的一些问题。让我们从主要的一个开始:为什么你需要在data
中分配一个全新的数组,其副本只是为了通过套接字发送它?它不像发送一个字母,send()
将传输信息的副本,而不是通过网络移动它。这样做非常好:
send(socket, data, counter * sizeof(unsigned short), 0);
有。你不需要任何新的指针。
另外,我不知道你从哪里得到序列化的东西。向量基本上是自动调整大小的数组,一旦函数完成,它们也会从内存中删除它们。你可以这样做:
std::vector<unsigned short> packet;
packet.reserve(counter);
for (std::size_t i = 0; i < counter; ++i)
packet[i] = data[i];
send(socket, &packet[0], packet.size() * sizeof(unsigned short), 0);
甚至缩短为:
std::vector<unsigned short> packet;
for (std::size_t i = 0; i < counter; ++i)
packet.push_back(data[i]);
但是使用此选项,向量将调整counter
次的大小,这是性能消耗的。如果您有可用信息,请务必先设置尺寸。