【发布时间】:2013-01-30 15:53:56
【问题描述】:
我有一个已经存在于数据库中的 B 树。现在,由其他一些程序员编写的以下代码尝试遍历 B-Tree。但是,我无法理解函数的用途是什么:readInner1(page,slot) 和 readInnerPage(page,slot)。有人可以通过使用这两个函数来帮助我理解代码的作用吗?
static inline unsigned readUint32Aligned(const unsigned char* data) { return toHost(*reinterpret_cast<const uint32_t*>(data)); }
/// The page remains accessible during the lifetime of the BufferReference object.
class BufferReference
{
public:
/// The size of a page
static const unsigned pageSize = 16384;
/// A page buffer
struct PageBuffer { char data[pageSize]; };
private:
/// The buffer frame
const BufferFrame* frame;
/// No copying of references
BufferReference(const BufferReference&);
void operator=(const BufferReference&);
public:
/// Constructor
BufferReference();
/// Constructor from a request
BufferReference(const BufferRequest& request);
/// Destructor
/// Access the page
const void* getPage() const;
/// Get the page number
unsigned getPageNo() const;
};
Info1(unsigned root,unsigned value1)
{
// Traverse the B-Tree
#define readInner1(page,slot) readUint32Aligned(page+24+8*(slot))
#define readInnerPage(page,slot) readUint32Aligned(page+24+8*(slot)+4)
BufferReference ref;
ref=readShared(root);
while (true) {
const unsigned char* page=static_cast<const unsigned char*>(ref.getPage());
// Inner node?
if (readUint32Aligned(page+8)==0xFFFFFFFF) {
// Perform a binary search. The test is more complex as we only have the upper bound for ranges
unsigned left=0,right=readUint32Aligned(page+16);
cout<<"\n right="<<right<<"\n";
while (left!=right) {
unsigned middle=(left+right)/2;
printf("\n MIDDLE=%d",middle);
unsigned middle1=readInner1(page,middle);
cout<<"\n middle1="<<middle1<<"\t value1="<<value1<<"\n";
if (value1>middle1) {
left=middle+1;
cout<<"\n left="<<left<<"\n";
} else if ((!middle)||(value1>readInner1(page,middle-1))) {
ref=readShared(readInnerPage(page,middle));
break;
} else {
right=middle;
cout<<"\n right="<<right<<"\n";
}
}
// Unsuccessful search?
if (left==right) {
ref.reset();
return false;
}
} else {
// A leaf node
break;
}
}
#undef readInnerPage
#undef readInner1
}
如果有人能解释一下代码,那就太好了?
【问题讨论】:
-
我喜欢那个程序员如何在明显的构造函数声明和类似的东西上方添加评论
/// Constructor,但没有花一行来解释他的黑客,呃,检索数据的构造...... -
那里可怕地使用宏,其范围是全局的,并且不限于函数。 Info1的语法错误也不是C++,所以也一定是宏。
-
@CashCow 是真的吗?最后的#undef 不起作用吗?
-
是的,undef 将取消定义它们。因此,如果宏在其他地方使用并且仍被定义,它只会“中断”,在这种情况下,您将收到重新定义宏的编译器错误。内联函数仍然是可取的。最好不要将实现放在标题中。
标签: c++ database data-structures