virtualなデストラクタ
C++では、ポリモーフィズムを利用するために作成した基底クラスのデストラクタにはvirtual
を付けることがあるようです.
virtual
がないと、基底クラスのポインタで管理している場合は、基底クラスのデストラクタのみが呼ばれてしまうためです.
初心者は「そんなこと聞いてないよ」となりそうで、不親切だとは思いますが、様々な理由でこうなっているはずなので仕方ないでしょう.
以下のようなコードで確認してみましょう
#include <iostream> #include <memory> struct Base{ Base(){ std::cout << " Base constructor" << std::endl; } ~Base(){ std::cout << " Base destructor" << std::endl; } }; struct Child : public Base{ Child(){ std::cout << " Child constructor" << std::endl; } ~Child(){ std::cout << " Child destructor" << std::endl; } }; int main(){ { std::cout << "unique_ptr:" << std::endl; std::unique_ptr<Base> pBase = std::make_unique<Child>(); } { std::cout << "shared_ptr" << std::endl; std::shared_ptr<Base> pBase = std::make_shared<Child>(); } std::cout << "Raw pointer" << std::endl; Base* pBaseRaw = new Child(); delete(pBaseRaw); return 0; }
実行結果はこうなります
unique_ptr: Base constructor Child constructor Base destructor shared_ptr Base constructor Child constructor Child destructor Base destructor Raw pointer Base constructor Child constructor Base destructor
Rawポインタとunique_ptr
では、Childのデストラクタが呼ばれていないのが確認できます.
基底クラスのデストラクタにvirtual
をつければ、全てChildのデストラクタを呼ぶようになります
また、shared_ptr
はvirtualデストラクタがないにもかかわらず、Childのデストラクタが呼ばれているのも面白いですね.
これは、shared_ptr
が作成時のクラスを利用してポインタを破棄してくれるからみたいです.
しかし、unique_ptr
ではやはりvirtual
が必要となるので、あまり安心はできなさそうですね.
単純な三角メッシュ
はてなのマークダウンの練習
CGの入門書に書いてあるようなやつです
メッシュ構造
メッシュ構造は3DCGで利用される3Dモデルの表現法です.
ここでは、シンプルなobjファイルで使われるような、頂点+三角形
で構成されるメッシュ構造を書いてみました
template <typename T> struct Vertex{ //頂点 //...コンストラクタなど...// tvec3<T> position; //位置座標 }; template <typename T> struct Face{ //面 //...コンストラクタなど...// std::shared_ptr<Vertex<T>> verticies[3]; //三頂点へのポインタ tvec3<T> normal; //法線 }; template <typename T> struct Mesh{ //メッシュ //...コンストラクタなど..// std::vector<std::shared_ptr<Vertex<T>>> verticies; //頂点へのポインタリスト std::vector<std::shared_ptr<Face<T>>> faces; //面へのポインタリスト };
各面はその三角形を構成する3頂点へのポインタを持ちます.
ついでに法線まで計算する気まんまんですが、不要な場合はなくても良いですね.
関数を全部削ってしまいましたが、簡単なので.
リソース開放はshared_ptr
とかに任せちゃうのがナウなヤングのやり方じゃないでしょうか.
もっと複雑なハーフエッジ構造などは少し凝った構築をしないといけなくて大変で、それに対する最適化手法も色々あります.
CGは奥が深いですね.
Fiio D03Kで遊ぶ
Fiio D03K
Fiio D03Kは安価なSPDIF入力のDACです.
入力は192KHz,24bitで光、同軸入力をサポートします.
どこかに192KHzは同軸のみと書いてありましたが、私の環境では光でも192KHz/24bitを受けれています.
オヤイデが代理店をやってるみたいです.高級オーディオの印象がありますが、こんなところで名前を見るとは思いませんでした.
D03KのIC構成は
CS8416 -> CS8416 -> LVM358
となっております.オペアンプが汎用品ですので、このあたりを変えて遊ぶことができます.
詳しい情報はこのページに載っています. よくできているので是非参考にしてみてください.
コンデンサとオペアンプの交換
回路の定数を変更しない簡単な強化を行ってみました.
電源部の470ufをOSコン(470uf)に変更.元のコンデンサはロープロファイル品なので、高さに注意してください.
私は頑張ってねじ込みました...
オペアンプはLVM358からOPA2353,OPA2211を試しました.
どちらも聴いた感じちゃんと動いているようですが、OPA2211では電源からノイズが乗りやすくなった気もします.
結局、音質面で高性能なOPA2211をチョイスしました. 動作電圧的にはギリギリかもしれません.
その他にも、AD8656やLME49721なんかも動くのかな?試してないですが.
パッケージはSOですのでMSOP版を買わないように注意しましょう.
5千円以内でこの音質が楽しめるなら十分コストパフォーマンスに優れると言えそうです.
本格的に電子工作に手を出すならオシロスコープがほしいものです.入門機でも結構いい値段するんですよね.
ではでは.