原创 四種迷宮生成算法的實現和可視化

(上圖是使用隨機化Prim算法生成一個200x200的迷宮的過程)Github項目地址:maze前言本文中的迷宮指的是最常見的那種迷宮:迷宮整體輪廓是二維矩形,迷宮裏的格子是正方形的,格子上下左右各相鄰另外一個格子(邊和角除外),迷宮內部沒

原创 使用bash和graphviz分析並可視化C/C++源文件依賴關係

流程流程並不複雜:使用find命令搜索指定目錄所有C/C++源文件掃描所有源文件,使用cpp(The C Preprocessor)過濾掉註釋後,使用sed提取#include,生成依賴條目將所有依賴條目拼成.dot文件,然後使用graph

原创 clang:FunctionDecl::isOutOfLine()和FunctionDecl::isInlined()能同時返回true嗎?

最近讀clang源碼時發現這麼一段代碼:FunctionDecl*FD=............if(auto*MD=dyn_cast<CXXMethodDecl>(FD)){......if(MD->isOutOfLine()&&....

原创 Qt:爲什麼QGraphicsView設置Antialiasing/SmoothPixmapTransform沒生效?

QGraphicsView::setRenderHint有兩個常用的選項:QPainter::Antialiasing和QPainter::SmoothPixmapTransform,前者是用來打開反走樣功能,後者用來在對圖片進行縮放時啓用

原创 bash的幾種特別的I/O重定向語法

下面這幾種重定向語法都很簡單,容易記住:ls>stdout.tx# 用標準輸出覆蓋stdout.txtlsnot-exist-file 2>stderr.txt# 用標準錯誤覆蓋stderr.txtlsexist-file not-exis

原创 條件變量爲什麼要和互斥量一起使用?

一個簡單的使用條件變量的場景:主線程從stdin讀取一個字符串,然後由echo線程打印這個字符串,正確的代碼是這樣的:#include<iostream>#include<condition_variable>#include<mutex>

原创 當std::bind遇到非靜態類成員函數

之前看項目代碼在實現表驅動方法時,經常會遇到這樣的代碼:// enum { ID0, ID1, ID2 };// std::map<int, std::function<void()>> Foo::m;// void Foo::func0(

原创 Linux C/C++調試之四:callgrind的侷限

在上篇文章中我介紹了callgrind的大致用法,可以看出來,callgrind是一個非侵入式的,使用起來也很傻瓜的調優工具。初用時感覺這個工具非常趁手,是個程序都想用callgrind去分析一下。但深入使用後發現,callgrind不是銀

原创 Linux C/C++調試之三:性能分析工具callgrind的使用

callgrind是valgrind工具套件中用於分析程序性能的一個工具,它能夠得到粒度爲函數、代碼行和指令級別的性能數據,具體來說,我們可以得到某個函數、某行代碼、某條指令處累計執行了多少條指令。我們看一個實例:// foo.cppint

原创 gettimeofday和clock_gettime是不是系統調用?

在《Linux多線程服務端編程》一書5.1節中提到過,在x86-64的Linux上,gettimeofday不是系統調用,不會陷入內核。其實這種說法有點小問題,因爲gettimeofday確實是個系統調用,但是linux的vdso(virt

原创 使用googletest測試可能斷言或導致進程退出的函數

做單元測試,一般是驗證函數輸出數據與預期是否相符。但是也有例外,我們可能需要驗證函數在接收到非法參數時是否會斷言或拋異常,例如下面這個例子:intfoo(int*p){assert(p!=nullptr);return*p;}當傳給foo的

原创 linux下監控shell腳本或可執行程序啓動過的子進程

使用history命令可以查看在shell中直接執行過的命令,但是無法查看間接執行過的命令,或者說啓動過的子進程。舉個例子,shell腳本或者make命令都會啓動一些子進程,這些子進程並不會顯示在history命令的輸出中,那麼如何監控他們

原创 Qt使用OpenGL進行多線程離屏渲染

基於Qt Widgets的Qt程序,控件的刷新默認情況下都是在UI線程中依次進行的,換言之,各個控件的QWidget::paintEvent方法會在UI線程中串行地被調用。如果某個控件的paintEvent非常耗時(等待數據時間+CPU處理

原创 ptrace系統調用的實現

最近遇到這樣一個問題,機器跑着跑着畫面凍結了,打開top看到Xorg的cpu佔用率100%。想用gdb掛上去看一下,結果gdb一直卡着掛不上去。後來又換用perf分析,結果發現進程99%的時間花在了一個ioctl調用。這個ioctl操作的是

原创 Qt在Linux下如何查找可用字體

最近遇到一個問題:一個Qt程序在Windows上正常運行,在Linux下編譯運行後漢字就全變成方塊了,成了名副其實的“方塊字”。我一開始考慮是字符編碼問題,調用QChar::unicode檢查中文字符的編碼,發現沒有問題。如果不是編碼問題,