自己常用的C C 小技巧

2021-10-01 10:22:35 字數 2220 閱讀 2972

這裡列出了自己常用的一些c/c++小技巧, 有些會有不足, 可以簡單**一下.

分類: 小技巧

同理可以用於其他位, 比如16位什麼的. 由於不同位的平台指標的大小可能是不同的, 所以導致一些邏輯必須分別討論.

很多時候我們可能不會在意是移動平台還是桌面平台, 但是肯定會在意指標的大小. c++的話可以使用模板特化方便地處理, 模板特化也是c非常難以模擬的特性之一.

最簡單的, 比如我們想在32位平台是用單精度浮點而64位平台使用雙精度浮點:

templatestruct float_helper_t;

template<>

struct float_helper_t<4> ;

template<>

struct float_helper_t<8> ;

using mfloat_t = float_helper_t::float_t;

分類: 隱藏實現, 零代價

pimpl很好用, 但是不是零代價的. 不過物件大小是在編譯器是固定(c++), 我們可以利用c++11的std::aligned_storage建立乙個零代價的pimpl. 同時針對不穩定api可以用static_assert進行編譯期斷言.

例如winapi有乙個srwlock, 表面上是乙個指標. 雖然我們可以用指標重解釋, 但是作為例子可以這麼實現:

// 標頭檔案

namespace detail ;

template<> struct rwlocker_impl_info<4> ; };

template<> struct rwlocker_impl_info<8> ; };

}class crwlocker ;

enum ;

protected:

std::aligned_storage::type m_impl;

};// 原始檔

// 最好進行編譯期斷言

crwlocker::crwlocker() noexcept

對於不穩定的api,static_assert是非常重要的.

分類: 實現技巧

基礎資料結構中, 鍊錶由於是指標的重要體現, 可以非常方便地處理多型:

------       ------       ------

node --> node --> node

------ ------ ------

data#1 data#2 data#3

------

------

------

例如比較常用的"工廠模式"建立的各個物件可以用鍊錶串起來:

struct node ;

struct factory ;

struct obj1 : node ;

struct obj2 : node ;

factory::factory()

每次新增節點可以在factory::tail.prev處做文章. 刪除節點由於有頭節點與尾節點的存在非常簡單:

node.prev->next = node.next;

node.next->prev = node.prev;

多型的實現, 一般來說就是c++使用的虛函式. 不過注意的是虛表指標會占用乙個指標的空間, 所以和節點的布局可以有兩種:

a ;

b ;

一般選用a模式, b比較難實現. a模式又有乙個物件導向常有的問題: 包含, 還是繼承?

c++有一些自己不喜歡的東西, 這些東西都是屬於, 對程式猿隱藏. a模式使用繼承的話,static_cast轉換node和繼承類會隱含乙個偏移判斷, 這個隱藏沒有問題. 問題是轉換前會對指標進行判斷, 如果是nullptr的話, 轉換後還是nullptr, 這個很合理但是自己不喜歡, 新增了乙個隱藏的分支.

所以自己可能會使用"包含"模式, 再使用offsetof進行手動轉換, 雖然offsetof對於非標準布局是ub行為, 但是實際上不是offsetof是ub, 而是非標準布局.

C C 入門易錯點及常用小技巧

int型 絕對值在10 9範圍內的整數都可以定義為int型 long long 型 如果long long型賦值大於2 23 1的初值,需要在初值後面加ll,否則會編譯錯誤。float,double輸入輸出格式 使用printf f c 語句時,f是float和double型的輸出格式。而在使用sc...

shell小技巧,自己用

1.逗號分割字串為陣列 host 10.0.0.1,10.0.0.2,10.0.0.3 host 3 10.0.0.1 10.0.0.2 10.0.0.3 2.檢視資料夾或檔案是否存在 if d pwd report then echo 建立資料夾 pwd report mkdir pwd repo...

python常用的小技巧

1 原地交換兩個數字 x,y 10,5 print x,y y,x x,y print x,y 10,5 5,10 2 鏈狀比較操作符 n 10 print 1 n 20 print 1 n 9 true false3 使用三元操作符實現條件賦值 表示式為真的返回值 if 表示式 else 表示式為...