まず、対象とするC++標準を定義する必要があります。私はそれが少なくともC + + 11だと思います。
一部のオペレーティングシステムカーネルでC++でコードを作成する場合は、関連するABIの仕様を慎重に検討してください(詳細はC++コンパイラのバージョンにも依存します)。例外処理やスタック巻き戻しロット)。
LinuxカーネルABIはC++に優しくないことに注意してください(x86-64ではLinuxユーザーランドABIと同じではありません)。したがって、LinuxカーネルのC++でのコーディングは妥当ではありません。
おそらく
void *mem = KMalloc(sizeof(Object));
Object *obj = new (mem) Object();
をしたい2番目のステートメントは、配置として渡された(「初期化されない」多かれ少なかれ)メモリ領域上でコンストラクタを実行するC++のplacement new機能を使用しています。
(memcpy
で-egオブジェクト++ Cのビット単位のコピーを気づく - ()POD Sを除いて一般的には未定義の動作であり、あなたはコンストラクタと代入演算子を使用する必要があります)
ない「配置が削除ありません"明示的にデストラクタを実行することができます:obj->~Object()
obj
ポインタで指されているオブジェクトの使用はundefined behaviorです。
ここで、そのコードが標準C++ライブラリなしで動作するかどうかを知りたいと思います。
あなたが信じているよりもはるかに難しいかもしれません。コンパイラが対象とするABIの詳細をすべて理解する必要がありますが、それは難しいことです。 を実行している
通知が適切に十分に良いorder- -inconstructors(およびdestructors)は、C++のための最も重要です。実質的に言えば、(暗黙的に)vtableフィールドを初期化していますが、オブジェクトがクラッシュすることはありません(virtual
メンバー関数またはデストラクタが呼び出されるとすぐに)。
rule of five(C++ 11の場合)についても読んでください。
C++で独自のカーネルをコーディングするには、実際にはC++実装(とABI)に関する多くの詳細を理解する必要があります。
NB:事実上のスマートポインタのmemcpy
で、ビット単位のコピーを言えば、std::stream
-sの、std::mutex
-esの、std::thread
-sの - そしておそらく標準コンテナのとstd::string
-sなどの... - 非常に災害を起こす可能性が高い。このような悪いことを敢行する場合は、具体的な実装の詳細を調べる必要があります。
これはプレースメントnewと呼ばれ、組み込み言語機能です。 –
あなたはどのカーネルを考えていますか?独自の、またはLinuxカーネル。 –
それは動作します。しかし、グローバル演算子 'new'と' delete'をオーバーロードして、あなたの人生をより楽にすることもできます。 – rustyx