C++ 将较小的数据块合并到一大块内存中
我有这样的代码:C++ 将较小的数据块合并到一大块内存中,c++,pointers,copymemory,C++,Pointers,Copymemory,我有这样的代码: ByteArray ret; ret.resize( MAX( body_left, tmp_read.size() ) ); while ( body_left > 0 ) { ByteArray::Write r = tmp_read.write(); int rec = 0; err = connection->get_partial_data( r.ptr(), MIN( body_left, tmp_read.size() ), r
ByteArray ret;
ret.resize( MAX( body_left, tmp_read.size() ) );
while ( body_left > 0 ) {
ByteArray::Write r = tmp_read.write();
int rec = 0;
err = connection->get_partial_data( r.ptr(), MIN( body_left, tmp_read.size() ), rec );
if ( rec > 0 ) {
ByteArray::Write w = ret.write();
copymem( w.ptr(), r.ptr(), rec );
body_left -= rec;
}
}
我发现理解这段代码很有挑战性。有几个问题:
是ret.resize(最大值(body_left,tmp_read.size())
通过数组分配最左边的正文或tmp\u read.size()
在ByteArray::Write r=tmp_read.Write()中
是否r
成为指向空间中用于写入数据的位置的指针
在ByteArray::Write w=ret.Write()中
,w
是否像上一个问题中的r
那样变成指针
此外,在这方面:
copymem(w.ptr(),r.ptr(),rec);
copymem(w.ptr(),r.ptr(),rec);
据我所知,在指针r
下收集的所有数据都被复制到指针w
下的位置。问题是它们的大小不同,如何移动指针w.ptr()
,以保持数据完整且顺序正确?或者是w.ptr()
是指向函数的指针,这应该不是问题
额外上下文:
方法get_partial_data
返回数据块,比如每个数据块有20、20和10个字节。
变量ret
的长度应为50字节,并将这些块合并为一个ByteArray
不幸的是,我在这个项目中找不到ByteArray
的定义,所以我猜它是另一个库的一部分(可能是libGL?)
我知道这个问题不是很精确,我的信心正在飞跃,但如果有人能帮助我,我将不胜感激
原始类和项目此代码取自:
第503-516行
它的形状不同,因为我已经应用了DirtyHack(这不太好用)
是ret.resize(最大值(body_left,tmp_read.size());分配
左边最高主体的字节数组或tmp_read.size()
MAX
最有可能是返回两个参数中较大值的宏。行ret.resize(MAX(body_left,tmp_read.size())
确保ret
对于可能发生的任何写入操作都足够大
在ByteArray::Write r=tmp_read.Write()中;r是否成为指向的指针
将用于写入数据的空间中的位置
在ByteArray::Write w=ret.Write();,w是否像r一样成为指针
在上一个问题中
是第187行定义的类。是在第209行定义的函数,它返回一个Write
对象,而不是指针。因此,r
和w
从来都不是指针
class Write {
// ...
};
Write write() {
Write w;
// ...
return w;
}
此外,在这方面:
copymem(w.ptr(),r.ptr(),rec);
copymem(w.ptr(),r.ptr(),rec);
据我所知,这一行中收集的所有数据
指针r被复制到指针w下的位置。问题是
它们的大小不同,如何移动指针w.ptr()来保存数据
完好无损,顺序正确吗?或者w.ptr()是指向函数的指针
这应该不是问题
是第36行定义的宏
#define copymem(m_to,m_from,m_count) \
do { \
unsigned char * _from=(unsigned char*)m_from; \
unsigned char * _to=(unsigned char*)m_to; \
int _count=m_count; \
for (int _i=0;_i<_count;_i++) \
_to[_i]=_from[_i]; \
} while (0);
#定义copymem(m_-to,m_-from,m_-count)\
做{\
无符号字符*_from=(无符号字符*)m_from\
无符号字符*_to=(无符号字符*)m_to\
int _count=m_count\
对于(int _i=0;_i来说,总结我(我们)到目前为止所学的一切:
原代码如下:
ByteArray::Write r = tmp_read.write();
int rec=0;
err = connection->get_partial_data(r.ptr(),MIN(body_left,tmp_read.size()),rec);
if (rec>0) {
ByteArray ret;
ret.resize(rec);
ByteArray::Write w = ret.write();
copymem(w.ptr(),r.ptr(),rec);
body_left-=rec;
if (body_left==0) {
status=STATUS_CONNECTED;
}
return ret;
}
#define copymem(m_to,m_from,m_count) \
do { \
unsigned char * _from=(unsigned char*)m_from; \
unsigned char * _to=(unsigned char*)m_to; \
int _count=m_count; \
for (int _i=0;_i<_count;_i++) \
_to[_i]=_from[_i]; \
} while (0);
ByteArray ret;
ret.resize(MAX(body_left,tmp_read.size()));
ByteArray::Write w = ret.write();
unsigned char * _to = (unsigned char*) w.ptr();
int _offset = 0;
while (body_left > 0) {
ByteArray::Write r = tmp_read.write();
int rec=0;
err = connection->get_partial_data(r.ptr(),MIN(body_left,tmp_read.size()),rec);
if (rec>0) {
unsigned char * _from=(unsigned char*)r.ptr();
for (int _i=0;_i<rec;_i++)
_to[_offset+_i]=_from[_i];
_offset += rec;
body_left-=rec;
}
}
if (body_left==0) {
status=STATUS_CONNECTED;
}
return ret;
其中copymem是一个宏,如下所示:
ByteArray::Write r = tmp_read.write();
int rec=0;
err = connection->get_partial_data(r.ptr(),MIN(body_left,tmp_read.size()),rec);
if (rec>0) {
ByteArray ret;
ret.resize(rec);
ByteArray::Write w = ret.write();
copymem(w.ptr(),r.ptr(),rec);
body_left-=rec;
if (body_left==0) {
status=STATUS_CONNECTED;
}
return ret;
}
#define copymem(m_to,m_from,m_count) \
do { \
unsigned char * _from=(unsigned char*)m_from; \
unsigned char * _to=(unsigned char*)m_to; \
int _count=m_count; \
for (int _i=0;_i<_count;_i++) \
_to[_i]=_from[_i]; \
} while (0);
ByteArray ret;
ret.resize(MAX(body_left,tmp_read.size()));
ByteArray::Write w = ret.write();
unsigned char * _to = (unsigned char*) w.ptr();
int _offset = 0;
while (body_left > 0) {
ByteArray::Write r = tmp_read.write();
int rec=0;
err = connection->get_partial_data(r.ptr(),MIN(body_left,tmp_read.size()),rec);
if (rec>0) {
unsigned char * _from=(unsigned char*)r.ptr();
for (int _i=0;_i<rec;_i++)
_to[_offset+_i]=_from[_i];
_offset += rec;
body_left-=rec;
}
}
if (body_left==0) {
status=STATUS_CONNECTED;
}
return ret;
注释/意见?
如果它让你感觉更好,我是一个相当熟练的C++开发者(即使我自己这么说),但是这个代码对我来说也没什么意义。它使用了我以前从未见过的类库。你在哪里找到代码?哈哈!谢谢大家,我更新问题与链接项目和一些额外的数据。不返回指针,所以他们不是指针我认为。至于CopyMeM,它是一个。我不是精通精通C++,所以别人可以回答你的问题。还有一件事我不清楚,线:CopyMeM(W pTr-(),R pTr-(),ReC),假设W pTr-()是一个指向内存中包含数据的位置的指针。这是否足以执行一组这样的操作:copymem(w.ptr(),r.ptr(),rec),copymem(w.ptr()+20,r.ptr(),rec),copymem(w.ptr()+40,r.ptr(),rec)(假设我们收到了20,20和10个字节,就像我问的原始问题一样)好吧,也许我会添加一个助手问题。行如下:unsigned char*\u from=(unsigned char*)m\u from,是否创建了一个新变量,它将作为指向unsigned char和指针值(location)的指针计算为从m_可以是的任何东西中转换为指针无符号字符?你是我的生命救星。感谢你的解释,我解决了所有问题。也许我的解决方案不是最好的,但很有效。我现在只关心内存泄漏。不确定如何检测这些。如果有人可以查看并确认,我将发布我的代码在我的代码中,你已经看到了更糟糕的情况,它在不违反C++世界中所有可能的良好实践规则的情况下完成了任务。