私はD2プログラミング言語にかなり慣れていません。クワッド エッジ データ構造を実装する必要があります。これは、効果的なグラフ埋め込みとその双対のための隣接データ構造です。以前の C の経験から、次の実装から始めました。
struct edge(T) {
edge* next;
T* data;
uint position;
}
alias edge[4] qedge;
edge* new_edge() {
qedge* q = new qedge; // does not compile, just analogous
// initialize the four edges (q[i].position = i)
return cast (edge*) q;
}
それはうまくいきますが、この位置フィールドは私を悩ませています - それはそこにあるスペースを無駄にしているだけです. qedge 配列にメモリを割り当てるときに (8 * ${machine word size}) 境界に合わせる方法はありますか (その場合、追加の位置フィールドは必要ありません。配列はエッジ アドレスにエンコードされます)?
私は効率的でかわいい実装を目指しているので (それが私が D を選んだ理由です)、他の提案は大歓迎です。
編集:これは、物事をより明確にするためのコードですhttp://dpaste.dzfl.pl/e26baaad :
module qedge;
class edge(T) {
edge next;
T* data;
}
alias edge!int iedge;
alias iedge[4] qedge;
import std.stdio;
import std.c.stdlib;
void main() {
writeln(iedge.sizeof); // 8
writeln(qedge.sizeof); // 32
// need something for the next line,
// which always returns an address, divisible by 32
qedge* q = cast (qedge*) malloc(qedge.sizeof);
writeln(q); // ex. 0x10429A0 = 17050016, which is, does not start at 32-byte boundary
}