【編譯製導指令】#pragma pack - 位元組數基準對齊
#pragma pack(1)
struct {
char c;
int i;
}S;
int main()
{
cout<<sizeof(S)<<endl;
}
那麼,結果為:
$ g++ main.cpp
$ ./a.exe
8
如果
#pragma pack(1)
struct {
char c;
int i;
}S;
這樣的結果為5
。
#pragma pack(2)
如果是這樣
#pragma pack(2)
struct {
char c;
int i;
}S;
那麼輸出結果為6
#pragma pack(3)
錯誤資訊
$ g++ main.cpp
main.cpp:5:16: 警告:對齊邊界必須是 2 的較小次方,而不是 3 [-Wpragmas]
#pragma pack(64)
^
#pragma pack(push,1)
與#pragma pack(1)
的區別
#pragma pack (n)
C編譯器將按照n個位元組對齊。 #pragma pack ()
取消自定義位元組對齊方式。 #pragma pack (push,1)
把原來對齊方式設定壓棧,並設新的1個位元組對齊 #pragma pack(pop)
恢復對齊狀態
例如:
#pragma pack(push) //儲存當前對齊狀態
#pragma pack(4) //設定為4位元組對齊
相當於
#pragma pack (push,4)
例子
#include <iostream>
using namespace std;
#pragma pack(1)
struct {
char c;
int i;
double d;
}S1;
#pragma pack() //與上面#pragma pack(4)對應
#pragma pack(4)
struct {
char c;
int i;
double d;
}S2;
#pragma pack()
#pragma pack(push,4)
struct {
char c;
int i;
double d;
}S3;
#pragma pack(pop)
int main()
{
cout<<sizeof(S1)<<endl;
cout<<sizeof(S2)<<endl;
cout<<sizeof(S3)<<endl;
}
結果為:
$ g++ main.cpp
$ ./a.exe
13
16
16
相關文章
- 1分鐘瞭解C語言正確使用位元組對齊及#pragma pack的方法C語言
- 位元組對齊
- linux 改變GCC編譯器的位元組對齊方式LinuxGC編譯
- golang 位元組對齊Golang
- 編譯指令PRAGMA SERIALLY_REUSABLE編譯
- 位元組對齊小談
- C++ 位元組對齊C++
- <摘錄>位元組對齊(強制對齊以及自然對齊)
- #pragma pack記憶體對齊的實現以及相關微軟面試題記憶體微軟面試題
- c/c++ 位元組對齊C++
- 記憶體位元組對齊記憶體
- iOS 記憶體位元組對齊iOS記憶體
- 【C++】C++的位元組對齊C++
- <摘錄>位元組對齊與結構體大小結構體
- C/C++ 結構體位元組對齊詳解C++結構體
- 淺談虛擬函式表與位元組對齊函式
- C語言:記憶體位元組對齊詳解C語言記憶體
- C/C++—— 記憶體位元組對齊規則C++記憶體
- python反編譯之位元組碼Python編譯
- 點陣圖四位元組對齊問題
- JWebAssembly:Java 位元組碼到 WebAssembly 編譯器WebJava編譯
- Java位元組碼指令Java
- c++記憶體中位元組對齊問題詳解C++記憶體
- 導庫標準引數指令碼指令碼
- 解析#pragma指令 (轉)
- Java位元組碼指令表Java
- 位元組編碼轉換
- 字元,位元組和編碼字元
- 位元組碼基礎
- 字串位元組數問題字串
- Class檔案結構&位元組碼指令
- 位元組碼指令分析 ++i 和 i++
- Python字元與位元組新編Python字元
- JVM 模板直譯器之如何根據位元組碼生成彙編碼?JVM
- 編碼、摘要和加密(一)——位元組編碼加密
- iOS開發#pragma預處理指令iOS
- JVMClass詳解之二Method位元組碼指令JVM
- 【JVM原始碼解析】模板直譯器解釋執行Java位元組碼指令(上)JVM原始碼Java