C 的卡常技巧

2021-09-26 18:15:42 字數 2130 閱讀 9946

register 的運用

register 相當於一種「暗示」,它暗示你的記憶體cache這個變數將會頻繁使用,使得你的cache存下該變數以便直接呼叫,常用於各種迴圈中

for

(register

int i=

1;i<=n;i++

)

++i與i++

在分別進行兩種操作時,不同於++i,i++將會先把i的值在記憶體中存下再運用,一般花費時間是++i的1.5倍左右,常用於迴圈(據說現在不少編譯器已經將此優化 )

for

(int i=

1;i<=n;

++i)

inline

原理類似register,用於非遞迴函式,多次呼叫下時間節省非常可觀

inline

bool

check

(int mid)

位運算

位運算一般來說包括但不限於以下幾種

① &(與) 兩數二進位制下各位同時為1取1,否則取0

如5&7=5

5的二進位制為 101

7的二進位制位 111

結果為 101

再轉為十進位制 返回 5

②|(或) 兩數二進位制下各位有至少一位為1時取1,否則取0

如8|4=12

8的二進位制為 1000

4的二進位制為 0100 (缺位補0)

結果為 1100

轉為十進位制 返回 12

③^(異或)兩數二進位制下各位相同時取0,不相同則取1

如9^4=13

9的二進位制為 1001

4的二進位制為 0100

結果為 1101

轉為十進位制 返回 13

④如 3>>1=6,3>>2=12

⑤>>j(退位) 將乙個數二進位制下所有數都向低位挪移j位,與進製相反(向0取整)

⑥~ (取反)將乙個數二進位制下所有數取反,即0變1,1變0.

以上僅適用於整數

注意,位運算的優先順序很低,略大於賦值和逗號

進一步優化

位運算相對於整數運算是很快的,也就是說,如果某些運算可以由位運算代替,你的程式就會快很多

如++i,你可以把它改寫為i=-~i;

for

(int i=

1;i<=n;i=

-~i)

如判斷乙個數的奇偶性,你原來可能是這樣寫的

if

(i%2==0

)printf

("偶數");

else

printf

("奇數"

);

但學了位運算之後你可以這樣

if

(i&i)

printf

("奇數");

else

printf

("偶數"

);

你想到了嗎?

在保證程式正確的情況下少用括號

括號對於理解**很有幫助,對於**速度雖然影響不大,但也有負擔,所以如果可以少打括號,就少打一點吧

注意以下情況

位運算 巨集展開 其他優先度較低的運算等

讀寫優化

cin,cout一般慢於scanf,printf

printf慢於put puts putchar

scanf慢於getchar

快讀模板

inline

intread()

ch=getchar()

;}while

(ch>=

'0'&&ch<=

'9')

return x*f;

}

快寫模板

inline

void

print

(int x)

return

;}

(待續)

並不對勁的卡常技巧

俗話說的好,心中有黨,常數極小。1 迴圈中加暫存器優化for register int i i n i 好像在開o2時這個沒什麼用。2 函式前inline int f int x 當呼叫函式本身的時間長度比執行函式的更長時效果會更顯著。配合read write 使用更佳。3 將取模運算改成if x ...

打FFT時中發現的卡常技巧

題目 洛谷p1919 a b problem 加強版 1.加register 這個不必多說了吧,卡常基本操作之一,但是貌似加多了也會慢 2.運算子過載時加上取位址符 本來是這樣 class cp cp operator const cp aa cp operator const cp aa 改成了這...

ACM特定演算法的卡常優化

今天做一道樹鏈剖分的題目,發現被卡常了,於是修改了很久,列印出執行時間,發現有這3個地方對常數的影響特比大 1.i o 用輸入外掛程式所消耗的時間大概是用關同步 tie的cin的一半 測試 輸入了1e5 3的資料,cin用了0.2s,in用了0.1s 2.vector 鏈式前向星 不得不說cache...