我正在做一些思想实验 - 我试图让我的生活变得更轻松。我正在使用一个数据结构,除其他外,它包含几个按排序顺序保存的元素数组。我将这些数据结构分配给固定大小的块,以便更容易地放置内存,并且(在将来的某个时间)使得从稳定存储更容易读/写。这是我到目前为止使用的代码:
#include <limits>
const int NODE_SIZE = 512;
template <typename K, typename D>
class Node {
long next;
short num;
K* keys;
D* data;
public:
Node( int l, int order );
};
// num is calculated by something like this...
num = NODE_SIZE - sizeof( Node<K,D> ) - sizeof( long );
num /= (sizeof( D ) + sizeof( K ));
// Constructor
// Will be called with a placement-new and given a NODE_SIZE
// byte block of memory, aligned at NODE_SIZE
template<typename K, typename D>
Node<K,D>::Node( int n ) : num ( n ), next( 0 ) {
keys = reinterpret_cast<K*>(reinterpret_cast<char*>(&next) +
sizeof( *this ));
int numbytes = num*sizeof(K);
// Make sure we're aligned to a void *.
if ( numbytes % sizeof( void * ) ) {
numbytes = (numbytes / sizeof( void * )+1)*sizeof( void * );
}
// Align to the number of bytes in a void *
data = reinterpret_cast<D*>( reinterpret_cast<char*>(keys)+numbytes);
for( int i=0; i<num; i++ ) keys[i] = std::numeric_limits<K>::max();
}
由于key中的元素按排序顺序,我真的喜欢能够使用std :: vector和std :: vector,所以我可以使用别人的矢量插入代码而不是写我自己(不是很难,但为什么重新发明轮子?)。
此外,是否有更简洁的方法来设置键和数据的指针?欢迎任何帮助或建议。
答案 0 :(得分:2)
您对num
的计算:
(NODE_SIZE - sizeof( Node<K,D> ) - sizeof( long )) / (sizeof( D ) + sizeof( K ))
特别是编译时常量。为什么不简单声明:
template <typename K, typename D>
class BpTreeNode {
static const std::size_t num = (NODE_SIZE - sizeof( long )) /
(sizeof( D ) + sizeof( K ));
K keys[num];
D data[num];
long next;
public:
Node( int l, int order );
};
让编译器为你工作吗?