謹慎使用#pragma pack

前段時間將一個項目由vc6.0轉爲vs2005,發現了有些對象的地址奇怪變化的問題,細查之下發現出現了#pragma pack亂用的問題,在恢復內存對齊使用了#pragma pack(pop, 1)的錯誤,估計程序設計者最初沒有注意到這個問題,不過很奇怪的是vc6.0卻沒有出現這個問題,總結一下#pragma pack使用的規範,避免之後亂用。安全

#pragma pack做用:指定結構體、聯合以及類成員的packing alignment;ide

語法:#pragma pack( [show] | [push | pop] [, identifier], n )spa

說明:設計

1,     pack提供數據聲明級別的控制,對定義不起做用;orm

2,     調用pack時不指定參數,n將被設成默認值;htm

3,     一旦改變數據類型的alignment,直接效果就是佔用memory的減小,可是performance會降低;對象

語法具體分析:內存

1,     show:可選參數;顯示當前packing aligment的字節數,以warning message的形式被顯示;get

2,     push:可選參數;將當前指定的packing alignment數值進行壓棧操做,這裏的棧是the internal compiler stack,同時設置當前的packing alignment爲n;若是n沒有指定,則將當前的packing alignment數值壓棧;it

3,     pop:可選參數;從internal compiler stack中刪除最頂端的record;若是沒有指定n,則當前棧頂record即爲新的packing alignment數值;若是指定了n,則n將成爲新的packing aligment數值;若是指定了identifier,則internal compiler stack中的record都將被pop直到identifier被找到,而後pop出identitier,同時設置packing alignment數值爲當前棧頂的record;若是指定的identifier並不存在於internal compiler stack,則pop操做被忽略;

4,     identifier:可選參數;當同push一塊兒使用時,賦予當前被壓入棧中的record一個名稱;當同pop一塊兒使用時,從internal compiler stack中pop出全部的record直到identifier被pop出,若是identifier沒有被找到,則忽略pop操做;

5,     n:可選參數;指定packing的數值,以字節爲單位;缺省數值是8,合法的數值分別是一、二、四、八、16。

 

通常比較適合的語法是

方法一:

#pragma pack(push, 4)//修改內存對齊爲4字節

//代碼

#pragma pack(pop)

方法二:

#pragma pack(push)

#pragma pack(4)//修改內存對齊爲4字節

//代碼

#pragma pack(pop)

固然,只要按照#pragma pack的語法要求正確的使用都是沒有問題的,但使用的時候必定要注意安全

相關文章
相關標籤/搜索