C/C++プログラミングの心得(二)

6738 ワード

参考資料
https://en.cppreference.com/
このサイトではC++の標準ライブラリの使い方が分かります。
https://isocpp.org
これはC++標準組織のウェブサイトです。C++の新しい特性を見ることができます。
http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines
これはC++の新しい特性のコード仕様ガイドです。
https://en.cppreference.com/w/cpp/compiler_support
ここでは、新しい特性に対する各コンパイラのサポート度合いを確認できます。
まとめてみると(209.6):
  • C++11/14はほぼサポートされています。
  • ハードウェア会社、例えばCray/Nvidia/Oracle(Sun)/IBMは基本的にC++17をサポートしていません。
  • C+2 aをサポートできるのはgcc、Clang、MSVC、EDG eccpだけです。その中でMSVCはサポートする特性が少ないです。他の3つは比較的に更新しています。
  • https://www.edg.com/
    これはEDGの公式サイトです。C++先端を専門にする会社です。そのため、彼らの更新はオープンソースのプロジェクトgcc/Clangと同じように頻繁で、驚くに足りないです。
    引用に関するよくあるエラー
    class Base
    {
      public:
        void something(Base& b){}
    };
    
    int main()
    {
      Base b;
      b.something(Base());
      return 0;           
    }
    
    上のコードをコンパイルすると、以下のようなエラーが発生します。
    abc.cpp:12:20: error: no matching function for call to ‘Base::something(Base)’
    abc.cpp:12:20: note: candidate is:
    abc.cpp:6:7: note: void Base::something(Base&)
    abc.cpp:6:7: note: no known conversion for argument 1 from ‘Base’ to ‘Base&’
    
    これはBase()によって生成された臨時変数であり、non-constに与えられた値の参照は不可能であるからである。
    解決方法はvoid something(const Base& b){}以下を参照してください。
    http://stackoverflow.com/questions/20247525/about-c-conversion-no-known-conversion-for-argument-1-from-some-class-to
    typedef struct
    Cにおいて:
    typedef struct Student
    {
      int a;
    }Stu;
    
    変数を宣言するときには、Stu stu1;typedefがないとstruct Student stu1;で宣言しなければなりません。
    ここのStuは実はstruct Studentの別名です。
    ただし、C++中:
    struct Student
    {
      int a;
    };
    
    変数を宣言するときは直接Student stu2;C++のライブラリにCのインターフェースを提供すると、よく次のような使い方が見られます。
    typedef struct Student Student;
    
    このようにして両者の違いを平らにすることができます。
    参考:
    https://www.cnblogs.com/qyaizs/articles/2039101.html
    structとtypedef structがよく分かりました。
    mallocとcaloc
    両方ともメモリを動的に割り当てます。
    主な違い:mallocは割り当てられたメモリを初期化せず、割り当てられたメモリの中で任意の値であってもよい。caloc初期化で割り当てられたメモリは0です。
    二次的な違い:calocは1つの配列を返しますが、mallocは1つのオブジェクトを返します。
    惰性の求め方
    http://www.cnblogs.com/gtarcoder/p/4811614.html
    c+11はl遅延呼び出しを実現する(惰性求値)
    http://www.fuzihao.org/blog/2016/02/10/C-%E5%AE%9E%E7%8E%B0%E6%83%B0%E6%80%A7%E6%B1%82%E5%80%BC/
    C++は不活性の値を求めることを実現します。
    左と右の値
    左の値は、賦課番号の左に置くことができる値です。左の値はメモリに実体がある必要があります。
    右の値は、賦課番号の右に値を取り出して他の変数に割り当てられた値を返します。右の値はメモリでもCPUレジスタでも大丈夫です。
    一つのオブジェクトが右の値として使用される場合、その内容(値)が使用され、左の値として使用される場合、そのアドレスが使用されます。
    左値文法:type & = ;右値文法:type && = ;C+11は、右値参照を導入することによって性能を最適化し、特にmove意味により、一時的に生成された左値のリソースを他のオブジェクトに無価値に移行する。
    しかし、右の値が導入されたのも新しい問題です。
    私たちはただですか?template void f1(T& t);まだありますtemplate void f2(T&& t);制限なしにT&& &T&&をパラメータとしてf 1に渡す)がありますので、引用折りたたみという概念があります。
    & & => &
    && & => &
    & && => &
    && && => &&
    
    上記の規則をlogical-ORとすると&は1であり、&&は0である。
    なお、一時変数は右値であるため、T&&のタイプは、f 2関数の中で実際にTである。
    std::move:無条件に右に移動します。
    std::forward:条件付きのものを右に引く。
    std::remove_reference:T&またはT&&Tに変更します。
    参考:
    https://www.cnblogs.com/ldlchina/p/6608154.html
    C++11右値参照とstd:move文の実例解析
    https://www.jianshu.com/p/b90d1091a4ff
    C++11 std::moveとstd:forward
    http://shaoyuan1943.github.io/2016/03/26/explain-move-forward/
    詳細にはC+11中移動語義(std::move)と完璧転送(std:forward)
    https://eli.thegreenplace.net/2014/perfect-forwarding-and-universal-references-in-c/
    Perfect forwarding and universal references in C++
    RAII
    リソース取得は初期化(Resource Acquisition Is Initialization)、またはRAIIと呼ばれるC+プログラミング技術であり、使用前に要求されたリソース(割り当てられたヒープメモリ、実行スレッド、開いたソケット、開いたファイル、ロックされた相互反発体、磁気ディスク空間、データベース接続など)を使用しなければならない。のライフサイクルは、オブジェクトの生存期間と結合されます。
    C++標準ライブラリはRAIIに従って自身の資源を管理します。クラスは構造関数においてその資源を取得します。(エラー時には異常を投げます。)そしてそのコンストラクションにおいて釈放されます。明示的な整理を要求しません。
    RAIIは、使用前に要求されたリソースではない:CPU時間、コア、およびキャッシュ容量、エントロピープール容量、ネットワーク帯域幅、電力消費、スタックメモリなどに適用されない。
    RAIIも以下に紹介する各種知能指針の理論的基礎である。
    参考:
    https://mp.weixin.qq.com/s/m44zVWMvactsLPjKsFnlSg
    RAII慣用法:C++資源管理の利器
    GC in C++
    https://www.hboehm.info/gc/
    A garbage collector for C and C+(boehm gc)
    https://blog.codingnow.com/2008/06/gc.html
    引用数とゴミ収集の比較
    https://www.cnblogs.com/duguguiyu/archive/2007/11/14/959178.html
    GC in C++