【编译制导指令】#pragma pack - 字节数基准对齐

#pragma pack(1)

struct {
    char c;
    int i;
}S;
int main()
{
    cout<<sizeof(S)< 
  

那么,结果为:

$ 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)<sizeof(S2)<sizeof(S3)< 
  

结果为:

$ g++ main.cpp
$ ./a.exe
13
16
16

你可能感兴趣的:(计算机语言)