C++が非常に優れた言語だという事が徐々にわかってきたので、OS制作にC++を採用したいと考えています。
しかし!!問題があります。
STLが使えない!
当たり前です。システムコールがない環境でシステムコールを使用しようとしているようなものです。
そこで、STLをfree standing環境でも使えるようにする必要があります。
しかし!ここにもまた問題が出現します。
Linuxを元にして制作することを考えましょう。
全て1人で作るのは無理なので!
new や vector、STLは、間違いなく動的記憶期間を利用しています。
前回の質問の通りです。
C++ヒープ領域について
このnewの部分をLinuxカーネルが採用しているスラブアローケータなどの確保関数に書き換えれば、行ける!!と考えました。
ここからが問題です。!!
(kmalloc や vmallocはここへどうぞ!)
malloc関数は、PODでない場合は使ってはマズイはずです。
In what cases do I use malloc vs new?
これと同じように、トリビアルでないクラスの場合に、vmallocやkmallocが安全に使えるか?
という疑問が出てきます。
これは、もしかしてダメな可能性がある!
そうなると・・・スラブアローケータをC++で独自に作り直さなくてはならなくなります。
あ、ちなみに・・・トリビアルなクラスについて確認です。
trivial classこちらを参考にしました。
ユーザー定義のコンストラクタ、コピーコンストラクタ
ムーブコンストラクタ、コピー代入演算子、ムーブ代入演算子、デストラクタを定義していない
trivially copyable class
これはユーザー定義したコピーコンストラクタ、ムーブコンストラクタ、コピー代入演算子、ムーブ代入演算子、デストラクタがないクラス。つまりコンストラクタだけはユーザ定義可能で、その他の自動生成される関数はコンパイラ定義なクラスということ。
コピー可能なトリビアルは、C言語と互換性ありましたっけ??(PODでしたっけ?)
コンストラクタ、デストラクタが使えないと・・・不便でしょうがないですね。
struct test{ test(int a){}; }
これって、引数ありのコンストラクタを定義しています。
この場合、コンパイラ定義のデフォルトコンストラクタって付いてくるんでしたっけ?
コンパイラ定義のデフォルトコンストラクタがあるなら、これはトリビアルなクラスでしょうか??
それとも、ユーザー定義が1でもあれば、それはもうトリビアルなクラスで無くなってしまうんですか?
この辺りイマイチちゃんと理解できてないです。
もう1つ問題があります。
速度についてです。
Linuxカーネルは、速度向上のため、memcpy関数などもC言語ではなく、アセンブリ言語で実装しています。
static void *__memcpy(void *dest, const void *src, size_t n) { long d0, d1, d2; asm volatile( "rep ; movsq\n\t" "movq %4,%%rcx\n\t" "rep ; movsb\n\t" : "=&c" (d0), "=&D" (d1), "=&S" (d2) : "0" (n >> 3), "g" (n & 7), "1" (dest), "2" (src) : "memory"); return dest; }
この関数・・・トリビアルでないクラスで使うとマズイ??
前回の質問で、yumetodoさんが上げているコード、uninitialized_move_if_noexcept_or_copy()をアセンブリ言語レベルで人為的に最適化を施さないと、Linux kernelレベルの速度を出せいないのでは??
ということですね。
つまり、既存のコードとの互換性の部分で問題が生じる・・・ということです。
これは、どうすれば良いと思いますか??
コンストラクタ、デストラクタを全面的に使用しないで、速度、互換性を優先するか?
それとも、積極的にコンストラクタとデストラクタを使用していく方針が良いか?
前者だと・・・C++を使う必要性が薄れてしまいますね。
逆に、後者だと、既存のコードをほぼ書き換えなくてはならなくなる可能性が・・・
どちらもちょっと・・・うーーん微妙ですね。
どちらが良い方法だと思いますか?
それか他になにか良い方法はありませんか?
OSは、速度が重要なので、C++で作ってカクカク動かれると困るんですよね。
こちらも参考にしました。こんなに制約がつくと流石にマズイですね。
Plain Old Data
それほど間違っていないPOD型
・自分でコンストラクタとか定義してない ・virtualという文字列を打ってない ・継承してない ・メンバ変数はprivate(もしくはpublic)にしか定義してない ・組み込み型(int, char, float…etc)しかメンバに持ってない
回答4件
あなたの回答
tips
プレビュー