Help us understand the problem. What is going on with this article?

C++erがD言語の勉強のメモ書きをしていく。

More than 5 years have passed since last update.

どこかにメモしておきたかったのでここに書き溜める。

クラス関係

クラスオブジェクトは参照によってのみインスタンス化される

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ごとに設定を変えることができるかどうか

まだ書いていないこと

  • メモリ関係
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away