原创 C++右值引用的示例

解釋 通常來說左值是指非零時對象,而右值是指臨時對象。我們知道c++在進行臨時對象的拷貝時會調用拷貝構造函數: vector<string> v; v.push_back(string("1234"); 產生的行爲就是先構造一個“

原创 gperftools檢查內存泄漏

上次,我們提到利用google gperftools定位程序cpu使用性能問題,這次利用同樣的工具的heap checker的功能對程序進行內存泄漏的定位。安裝請看之前的文章: #include <iostream> #inclu

原创 c++11 thread

c++11在語言層面上提供了對thread的支持,由於不同的平臺提供了不同線程API,在語言層面提供了對thread的支持可以大大的減小代碼移植的工作量。 thread的構造函數參數爲函數名和可變參數,請看栗子 thread的默

原创 Linux FIFO (進程間通信,生產者消費者)

上一篇中我們寫到了PIPE無名管道,的確是一種很方便的通信機制,但是其有一個缺點就是,PIPE是依賴於文件描述符的,並不在文件系統中維護,如果兩個通信進程之間沒有共同的祖先,他們就無法拿到相同的文件表項,所以沒有共同祖先的兩個進程

原创 SpringBoot NULL轉“”(空字符串)

#SpringBoot NULL轉“”(空字符串) 有時候前端的同學要求把String類型爲NULL變成空字符串“”返回給他們,然而我們又不能簡單的把全局的所有的類型爲NULL的對象都這麼去處理,而且也不能在非Http請求中這麼返

原创 VIM命令備忘錄

本文僅僅是寫給自己的備忘錄,沒有條理,請謹慎閱讀 :ls 顯示打開的文件 我習慣vim用NerdTree打開一大堆文件,或者ctags跟蹤跟蹤着就一大堆文件了,這時打開的文件一般在buffer中,這時又記不起具體文件名,想

原创 JavaScript IP轉INT(整形)

有時候我們需要在web頁面中對ip進行一些和掩碼相關的驗證,由於掩碼是二進制的概念(當然如果你字符串操作實在很溜,經歷旺盛的話,那就可以不用往下讀了,讀到這裏爲止了)。JavaScript位操作和c差不多,但是JavaScript

原创 dup2複製文件描述符

dup2是Linux下用來實現文件描述符複製的api,dup2(fd1, fd2)將會把fd1複製到指定的fd2下,如果fd2是一個已經打開的描述符,dup2會自動的先將其安靜的關閉。我們知道Linux的進程表中會維護打開的文件表

原创 Linux Pipe (進程間通信,生產者消費者)

PIPE是Linux下可以用來實現進程間通信的一種手段,當我們調用pipe系統調用時,將會產生一對文件描述符,fd[0]可以用來讀,fd[1]用來寫,fd[1]寫的數據將會在fd[0]中讀到,我們稱之爲管道。進程之間可以依賴管道的

原创 基數排序

基數排序是一種“非比較排序算法”,什麼叫非比較排序算法呢,就是在實施排序的過程中,沒有直接的比較元素之間的大小。其複雜度和被排序個數呈線性關係,原理是利用從小到大依次基於更小的已經排序的位的每一個十進制位進行排序,最後得到排序後的

原创 用最大堆實現優先隊列(c++)

關於最大堆,最小堆的概念這裏不再介紹。 #include <iostream> #include <vector> using namespace std; template<typename T> class Priority

原创 跳躍表的實現(c++)

跳躍表簡單的說就是個能夠提供快車道(區間的索引)實現快速訪問的有序鏈表,普通的鏈表的查找複雜度是n,這個複雜度太大了,跳躍表查找插入刪除都在lg(n)的複雜度,是一種隨手就能寫出來的數據結構(爲什麼這麼說呢,因爲其它lg(n)的可

原创 git使用代理

今天在git clone gRPC的時候boringssl卡住了,原因是boringssl的源是google source的,被牆了。但是本人木有可以全局代理的工具,只有一個可以本地代理http(s)的工具,所以讓git走http

原创 一個換行符引發的“血案”

今天項目發生了一件很有意思的事情,案件很離奇。案件的經過是這樣的: 案件經過 我們在寫一個庫對接硬件平臺和第三方模塊,庫封裝了一些平臺有關的接口給第三方使用,但是當我們把對接第三方模塊的時候對方服務器報錯了,服務器方反饋上報的某個

原创 Linux 動態裝載庫(dlopen)

Linux有時我們需要在運行時指定庫的路徑去加載庫,而不是依賴於系統自動動態鏈接。比如說我們在需要做到動態加載庫插件時就會用到動態裝載庫的特性(比如像lighthttpd和nginx的動態mod功能),Linux提供了函數來幫助我