どこかにメモしておきたかったのでここに書き溜める。
クラス関係
クラスオブジェクトは参照によってのみインスタンス化される
D言語は以下のようにオブジェクトを生成する。
MyClass mine = new MyClass();
これはC++の以下のコードに相当するイメージ。
MyClass* mine = new MyClass();
関数にオブジェクトを渡す、関数からオブジェクトを返すときはすべて参照でやりとりしていると考える。 struct などのクラス以外の型は実体が基本になる。構文上は区別がつかないので意識すること。
オブジェクトの private メンバは同一モジュールの非メンバ関数からアクセスできる
C++で言うところの friend に近い。必然的にファイルの構成まで意識する必要がある。
module my_package.my_module;
class MyClass
{
/* ... */
private int my_data;
package int another_data;
}
void func(MyClass mine)
{
writeln(mine.my_data);
}
オブジェクトの package メンバは同一パッケージのモジュールからアクセスできる。
これも friend に相当。クラスに関係する関数が多くなった時に便利。
module my_package.my_other_module;
import my_package.my_module;
void func(MyClass mine)
{
writeln(mine.another_data);
}
メモリ関係
- 基本的にメモリの解放はガベッジコレクタに任せる
- RAII や scoped_lockのようなことをしたい場合はローカル変数を scope で宣言する。
- C言語のライブラリを使うなどの場合 scope(exit) スコープガード文を使用する。
- GC.malloc で確保したメモリはガベッジコレクタで解放される。
- - クラスのデストラクタで free するとガベッジコレクタによりすでに解放されている場合があるため落ちることがある。必要ない。
dub
プロジェクトの構築と依存関係の解決はdubを使って行うのが主流らしい。
コンパイラの選択は --compiler オプションで行う
dub.json から設定できるようにして欲しい・・・。
まだわかっていないこと
- コンパイル済みライブラリの template を使用した場合にどのようにコンパイルされるのか
- 同様にコンパイル済みのライブラリの関数はアプリケーションコードからインライン化されるのか、されるとしてどのようにコンパイルされるのか
- dub でOSごとに設定を変えることができるかどうか
まだ書いていないこと
- メモリ関係