語言學(xué)習(xí)類
Learn Cpp
Learn Cpp是一個英文的C++教程網(wǎng)站技即,教你如何從完全沒有編程基礎(chǔ)到使用c++進行編程。目前共有23章以及3個附錄驮吱。如果你喜歡在在線教程并且英語勉強過關(guān),這是一個不錯的學(xué)習(xí)網(wǎng)站萧吠。
Runoob
如果實在是英語不行或者指向看中文的教程左冬,作為入門,Runoob也可以一看纸型。這個網(wǎng)站提供了常見的各種語言的入門教程拇砰,網(wǎng)站本身也可以在線編譯和運行c++程序。
地址:https://www.runoob.com/cplusplus/cpp-tutorial.html
編譯運行工具
C++ shell
C++ shell是一個在線編譯運行網(wǎng)站狰腌。支持從98到23的c++標準除破,三個警告選項(-Wall, -Wextra, -Wpedantic)以及五個優(yōu)化級別選項(-O0, -O1, -O2, -O3, -Oz)。功能相對簡單琼腔,但是測試一些隨手寫的代碼足夠了瑰枫。
Online GDB
Online GDB是一個多語言的在線編譯運行網(wǎng)站,可以看成是C++ shell的增強版丹莲。就像它的名字說的一樣光坝,特色就是提供了在線的GDB調(diào)試功能。GDB對于使用Linux編程的同學(xué)來說可能更加熟悉甥材,建議不熟悉的同學(xué)都可以學(xué)習(xí)一下使用盯另,絕對是調(diào)試程序的利器。
Wandbox
也是一個多語言的在線編譯網(wǎng)站洲赵。特點是可以選擇是否使用boost鸳惯,也可以手動往里面填編譯選項商蕴。
性能Profiler
Quick Bench
在線的benchmark網(wǎng)站,可以快速比較多段代碼的性能悲敷。它可以讓你選擇編譯器究恤、c++標準俭令、優(yōu)化級別以及使用的stl版本后德。Run Benchmark之后你可以在左邊看到用圖展示的benchmark的結(jié)果,然后在Assembly這個tab里面還可以看到到底是哪部分比較吃性能抄腔。
Perf Bench
一個跟QuickBench類似的benchmark網(wǎng)站瓢湃。里面有兩個特點:
- 除了圖標還有更加詳細的報表數(shù)據(jù);
- 記錄每一次運行的數(shù)據(jù)赫蛇。
個人是更喜歡這個網(wǎng)站的profile功能绵患。
探索內(nèi)部編譯
Godbolt
Compiler Explorer是2019年在Cpp大會上做過presentation(CppCon 2019: Matt Godbolt “Compiler Explorer: Behind The Scenes”)的在線網(wǎng)站,它主要的特點是把c++實時轉(zhuǎn)換成匯編悟耘。匯編可選種類也比較多落蝙,arm匯編,x86匯編配合各個版本的編譯器暂幼。非常有特色的一點是你把鼠標放在左邊的cpp文件的某一行的時候筏勒,右邊對應(yīng)的匯編也會被高亮,這樣你能夠很容易知道每一行轉(zhuǎn)換出的對應(yīng)的匯編是什么樣的旺嬉。
這絕對是一個你直接去嘗試一下的一個網(wǎng)站管行。
Cpp Insights
這是一個探索C++的source-to-source的變換的網(wǎng)站。它不想Godbolt給你展示最后的匯編邪媳,而是展示C++源碼中間轉(zhuǎn)換的過程捐顷。比如下面的簡單的模版,它可以展示給你特化后的樣子雨效。
源碼:
#include <cstdio>
template <typename T>
struct Vec
{
Vec(): Vec(0, 0, 0){}
Vec(T a, T b, T c): x{a}, y迅涮, z{c}{}
Vec operator+(const Vec &rhs) const
{
return Vec{x+rhs.x, y+rhs.y, z + rhs.z};
}
T x, y, z;
};
int main()
{
using Vec3i = Vec<int>;
using Vec3f = Vec<float>;
Vec3i v1, v2;
auto v = v1+v2;
printf("%d, %d\n", v.x, v.y);
return 0;
}
CppInsight展示的轉(zhuǎn)換之后的代碼:
#include <cstdio>
template<typename T>
struct Vec
{
inline Vec()
: Vec<T>{0, 0, 0}
{
}
inline Vec(T a, T b, T c)
: x{a}
, y
, z{c}
{
}
T x;
T y;
T z;
inline Vec<T> operator+(const Vec<T> & rhs) const
{
return Vec<T>{{this->x + rhs.x, this->y + rhs.y, this->z + rhs.z}};
}
};
/* First instantiated from: insights.cpp:21 */
#ifdef INSIGHTS_USE_TEMPLATE
template<>
struct Vec<int>
{
inline Vec()
: Vec<int>(0, 0, 0)
{
}
inline Vec(int a, int b, int c)
: x{a}
, y徽龟
, z{c}
{
}
int x;
int y;
int z;
inline Vec<int> operator+(const Vec<int> & rhs) const
{
return Vec<int>{this->x + rhs.x, this->y + rhs.y, this->z + rhs.z};
}
};
#endif
int main()
{
using Vec3i = Vec<int>;
using Vec3f = Vec<float>;
Vec<int> v1 = Vec<int>();
Vec<int> v2 = Vec<int>();
Vec<int> v = v1.operator+(v2);
printf("%d, %d\n", v.x, v.y);
return 0;
}
歡迎關(guān)注公眾號“探知軒”叮姑。