#pragma分析
#pragma用于指示編譯器完成特定的操作。并且,#pragma很多指示字是編譯器特有的。在不同的編譯器間不可實現移植。
先來講一個比較常用的pragma參數字------message。這個指示字在大多數的編譯器中都有實現。它是在編譯時輸出消息到編譯輸出窗口。在條件編譯中,可以提示代碼的版本信息。那么,通過一個代碼實例來理解一下。
接下來介紹第二個參數字once。該參數用來保證頭文件只被編譯一次。
用法:
比如有一個頭文件,fruit.h。然后,在這個文件中,
這樣就保證,該頭文件只在其他文件中包含一次。
once和#ifndef都能保證頭文件只包含一次,這兩者有區別嗎?答案是肯定的。
使用#ifndef來保證頭文件只包含一次,這樣做的效率較低,為什么呢?事實上,使用#ifndef并非頭文件只包含了一次,而是,包含了調用頭文件的所有次數,只不過是都被過濾掉了,留下了一次。而使用once確確實實只包含了一次。但是,由于once這個參數并不是所有編譯器都有的,那么怎樣才能我既想效率高又想不會出現編譯器不支持once的問題呢。只要這樣做,
然后是第三個,也是最重要的一個參數,pack。這個是設置內存對齊方式的。由于CPU讀取內存時是按照塊來讀取的,所以,在結構體中定義結構體成員的方式不同,最終占用的內存空間就不同。如果沒有進行相應的設置,那么CPU默認按照4字節來訪問內存空間。舉例說明:
struct type{char c;int a;int b;float d; };這段代碼在內存中占用的空間是多少呢?答案是16個字節。由于變量c為char型,偏移地址從0開始,然后,變量a為int型,當CPU訪問時已經從偏移地址為4開始訪問。當遇到變量b時,偏移地址從8開始,最后float占4個地址空間,當CPU訪問時從12開始,所以,最終,該結構體占了16個字節的內存空間。那么pack的作用就是讓結構體成員合理分布,盡可能占用較少的內存空間。用法,比如:
#pragma pack ( 1 ) struct type{ char c; int a; int b; float d; }; #pragma pack()轉載于:https://blog.51cto.com/chen0547/2044801
總結
- 上一篇: js中this关键字的使用
- 下一篇: hotmail在outlook2007中