C++コンパイルコマンド葃pragma packのペアリング使用
4823 ワード
pragma packは、C++データ構造のメンバー変数のメモリ整列値(オプション値は1、2、4、8、16)を指定するために使用できます.
本論文では主に、プロジェクト内の他のソースファイルの構成メンバーのメモリの配置に影響を与えないように、あなたのヘッドファイルにpack命令を使用することを強調します.
他のソースファイルの構成メンバーのメモリ配置に影響を与えた場合、デフォルトのペアでそれらの構成メンバーのメモリサイズを計算します.
またはポインタを使って構造メンバーのオフセット位置を計算すると、予想外の異常が発生する可能性があります.
主に可能な異常はメモリポジショニングエラーまたは不正メモリアクセスであり、結果として誤った位置決めや数値が発生し、極端な場合にはプログラムが崩壊する可能性があります.
以下の例は、基本的なペアリングの使用方法を示すために用いられる.
1)〓〓pragma pack(n)のペアリング使用
2)〓〓pragma pack(push_pop,n)のペアリングに使用します.
MSDN上のVC+2013のヘルプ文書は、pack命令の使い方について以下のように説明しています.
----------------以下MSDNから抜粋する----------------
葃pragma pack( [
n)
)
Specifies packing alignment for structure and union members.Whers the packing align ment of structures and unions is set for and entire trant trant it by the packing alignment is set the data-claration pack pragma.The pragma Taes effect at the first structure or union declaration after the pragma is seen;the pragma hasのeffect on definitions.
When you use #pragma pack(n)、where n is 1,2,4,8,or 16,each structure member after the first is stored on the smaler member type or n-byte boundaries.If you use菗pragma pack without an argment、structure members ared to the value specified by/Zp.The default/Zp packing size/Zp 8.
The compler also supports the follwing enhanced syntax:
葃pragma pack( [{{ プッシュする | pop} ] [ identifer ] ] [ n ] )
This sysntax allows you to componene program components into a single tranlation unit if the different components use pack pragmas to specify different packing alignments.
Each occurrence of a pack pragma with a プッシュする argment stors the current packing alignment on an internal compler stack.The pragma’s argment list is read from left to right.If you use push,the current packing value is stored.If you provide a value for n,that value becompes the new packing value.If you specify an identifer,a name of your chosing,the identifer is assciated with the new packing value.
Each occurrence of a pack pragma with a ポップ argment retrieves the value at the top of an internal compler stack and makes that value the new packing align ment.If you use ポップ and the internal compler stack is empty,the alignment value is that set from the command a warning is issued.If you use ポップ and specify a value for n,that value becompes the new packing value.If you use ポップ and specify an identifer,all values stored on the stack are removed from the stack until a matchigidentifer is found.The packing value asociated with the identifer is also removed from the stack and the packing value that existed just before the identifer was pused becompes the new packing value.Ifのmatching identifer is found,the packing value set from the command the command a level-one warning is issued.The default packing alignment is 8.
本論文では主に、プロジェクト内の他のソースファイルの構成メンバーのメモリの配置に影響を与えないように、あなたのヘッドファイルにpack命令を使用することを強調します.
他のソースファイルの構成メンバーのメモリ配置に影響を与えた場合、デフォルトのペアでそれらの構成メンバーのメモリサイズを計算します.
またはポインタを使って構造メンバーのオフセット位置を計算すると、予想外の異常が発生する可能性があります.
主に可能な異常はメモリポジショニングエラーまたは不正メモリアクセスであり、結果として誤った位置決めや数値が発生し、極端な場合にはプログラムが崩壊する可能性があります.
以下の例は、基本的なペアリングの使用方法を示すために用いられる.
1)〓〓pragma pack(n)のペアリング使用
//filename: header1.h
#pragma pack(1) // 1
struct s1
{
int i;
char c;
bool f;
}
//struct s2{...}
//...
#pragma pack() // ( )
2)〓〓pragma pack(push_pop,n)のペアリングに使用します.
//filename: header2.h
#pragma pack(push,1) // 1
struct s3
{
int i;
char c;
bool f;
}
//struct s4{...}
//...
#pragma pack(pop) // ( )
MSDN上のVC+2013のヘルプ文書は、pack命令の使い方について以下のように説明しています.
----------------以下MSDNから抜粋する----------------
葃pragma pack( [
n)
)
Specifies packing alignment for structure and union members.Whers the packing align ment of structures and unions is set for and entire trant trant it by the packing alignment is set the data-claration pack pragma.The pragma Taes effect at the first structure or union declaration after the pragma is seen;the pragma hasのeffect on definitions.
When you use #pragma pack(n)、where n is 1,2,4,8,or 16,each structure member after the first is stored on the smaler member type or n-byte boundaries.If you use菗pragma pack without an argment、structure members ared to the value specified by/Zp.The default/Zp packing size/Zp 8.
The compler also supports the follwing enhanced syntax:
葃pragma pack( [{{ プッシュする | pop} ] [ identifer ] ] [ n ] )
This sysntax allows you to componene program components into a single tranlation unit if the different components use pack pragmas to specify different packing alignments.
Each occurrence of a pack pragma with a プッシュする argment stors the current packing alignment on an internal compler stack.The pragma’s argment list is read from left to right.If you use push,the current packing value is stored.If you provide a value for n,that value becompes the new packing value.If you specify an identifer,a name of your chosing,the identifer is assciated with the new packing value.
Each occurrence of a pack pragma with a ポップ argment retrieves the value at the top of an internal compler stack and makes that value the new packing align ment.If you use ポップ and the internal compler stack is empty,the alignment value is that set from the command a warning is issued.If you use ポップ and specify a value for n,that value becompes the new packing value.If you use ポップ and specify an identifer,all values stored on the stack are removed from the stack until a matchigidentifer is found.The packing value asociated with the identifer is also removed from the stack and the packing value that existed just before the identifer was pused becompes the new packing value.Ifのmatching identifer is found,the packing value set from the command the command a level-one warning is issued.The default packing alignment is 8.