C/C++编程心得(二)
參考資料
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
這里可以查看各個編譯器對于新特性的支持程度。
總結下來就是(2019.6):
-
C++ 11/14基本都支持了。
-
硬件公司如Cray/Nvidia/Oracle(Sun)/IBM基本不支持C++ 17。
-
能支持C++2a的就只有gcc、Clang、MSVC和EDG eccp了,其中MSVC支持的特性較少,而其他三者相對更新的比較勤。
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與calloc
兩者都是動態分配內存。
主要的不同:malloc不初始化分配的內存,已分配的內存中可以是任意的值。calloc初始化已分配的內存為0。
次要的不同:calloc返回的是一個數組,而malloc返回的是一個對象。
惰性求值
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<typename T> void f1(T& t);
現在還有:
template<typename T> void f2(T&& t);
不加限制的話,還會有T&& &(將T&&作為參數傳給f1),所以就有了引用折疊(Reference collapsing)的概念,即:
& & => & && & => & & && => & && && => &&如果把上述規則看作logical-OR的話,那么&就是1,而&&就是0。
注意,因為臨時變量是右值,所以T&&的類型在f2函數體內實際上就是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++
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的C/C++编程心得(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习(四十三)——深度强化学习(6)
- 下一篇: C/C++编程心得(三)