gpt4 book ai didi

c++ - 将较小的数据 block 合并到一大块内存中

转载 作者:行者123 更新时间:2023-11-28 06:43:50 27 4
gpt4 key购买 nike

我有这样的代码:

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(MAX(body_left,tmp_read.size()));分配最高body_leftByteArray >tmp_read.size()?

ByteArray::Write r = tmp_read.write(); 中,r 是否成为指向将用于写入数据的空间位置的指针?

ByteArray::Write w = ret.write();中,w是不是像上一个问题中的r一样变成了一个指针?

此外,在这一行中:

copymem(w.ptr(),r.ptr(),rec);

据我了解,在指针 r 下收集的所有数据都被复制到指针 w 下的位置。问题是它们的大小不同,如何移动指针 w.ptr() 来保持数据的完整性和正确的顺序?或者 w.ptr() 是指向函数的指针,这应该不是问题。


额外上下文:

方法 get_partial_data 返回数据 block - 假设分别为 20、20 和 10 字节。变量 ret 应该是 50 个字节长,并将这些 block 合并到一个 ByteArray 中。

不幸的是,我在这个项目中找不到 ByteArray 的定义,所以我猜它是另一个库的一部分(也许是 libGL?)。

我知道这个问题不是很准确,我正在做一次信仰的飞跃,但如果有人能帮助我,我将不胜感激。

此代码的原始类和项目取自:

https://github.com/okamstudio/godot/blob/master/core/io/http_client.cpp

第 503-516 行。

它的形状不同,因为我已经应用了肮脏的 hack(效果不佳)。

最佳答案

Is ret.resize(MAX(body_left,tmp_read.size())); allocating the ByteArray of highest body_left or tmp_read.size()?

MAX 很可能是一个返回两个参数中较大者的宏。 ret.resize(MAX(body_left,tmp_read.size())); 行确保 ret 足够大以应对可能发生的任何写入操作。

In ByteArray::Write r = tmp_read.write(); does r become a pointer to location in space that is going to be used to write data?

In ByteArray::Write w = ret.write();, does w become a pointer like r in the previous question?

Write是第 187 行定义的类。write()是第 209 行定义的一个函数,它返回一个 Write 对象,而不是一个指针。因此 rw 永远不是指针。

class Write {
// ...
};

Write write() {
Write w;
// ...
return w;
}

Also, in this line:

copymem(w.ptr(),r.ptr(),rec);

As I understand this line, all of the data that is gathered under pointer r is copied to location under the pointer w. The problem is that they are different size, how to move pointer w.ptr() to keep data intact and in correct order? Or is w.ptr() is a pointer to function and this should not be a problem.

copymem是第 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);

这段代码似乎只是将m_from 的内容复制到m_toget_partial_data 将要读取的数量提供给 rec,它作为 m_count 传递给 copymem

关于c++ - 将较小的数据 block 合并到一大块内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25416996/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com