#pragma pack(n)

Posted 悠悠南山下

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#pragma pack(n)相关的知识,希望对你有一定的参考价值。

#pragma pack(n)
重要规则:
1,复杂类型中各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个类型的地址相同;
2,每个成员分别对齐,即每个成员按自己的方式对齐,并最小化长度;规则就是每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数中较小的一个对齐(对于单个char出现时,必须为2的整数倍,比如n=2时,char 占一位,但是后面有一位空;char [2],直接存储,不空位);
3,结构、联合或者类的数据成员,第一个放在偏移为0的地方;以后每个数据成员的对齐,按照#pragma pack指定的数值和这个数据成员自身长度两个中比较小的那个进行;也就是说,当#pragma pack指定的值等于或者超过所有数据成员长度的时候,这个指定值的大小将不产生任何效果;
4,复杂类型(如结构)整体的对齐是按照结构体中长度最大的数据成员和#pragma pack指定值之间较小的那个值进行;这样在成员是复杂类型时,可以最小化长度;
5,结构整体长度的计算必须取所用过的所有对齐参数的整数倍,不够补空字节;也就是取所用过的所有对齐参数中最大的那个值的整数倍,因为对齐参数都是2的n次方;这样在处理数组时可以保证每一项都边界对齐;
#pragma pack(n)
struct node1{
int a;
char b;
short c;
char d;
}test1;
sizeof(test1)
n=1,大小为8, a(4)+b(1)+c(2)+d(1)
n=2,大小为10, a(4)+b(2)+c(2)+d(2)
n=4,大小为12, a(4)+b(2)+c(2)+d(2)
 
struct node2{
int a;
char b;
struct node1 c;
char d;
}test2;
sizeof(test2)
n=1,大小14, a(4)+b(1)+c(8)+d(1)
n=2,大小18, a(4)+b(2)+c(10)+d(2)
n=4,大小24 a(4)+b(2)+c(12)+d(2)
 
struct node3{
int a;
char b[2];
struct node1 c;
}test3;
sizeof(test3)
n=1,大小14, a(4)+b(2)+c(8)
n=2,大小16, a(4)+b(2)+c(10)
n=4,大小20 a(4)+b(2)+c(12)
 
union un1{
char a[5];
int i;
}u1;
sizeof(u1)
n=1,大小5, a(5)
n=2,大小6, a(5)
n=4,大小8 a(5)
 
struct node4{
int a;
char b[3];
union un1 c;
}test4;
sizeof(test4)
n=1,大小12, a(4)+b(3)+c(5)
n=2,大小14, a(4)+b(4)+c(6)
n=4,大小16 a(4)+b(4)+c(8)
#include<iostream>

using namespace std;

#pragma pack(4)

struct node1{
    int a;
    char b;
    short c;
    char d;
}test1;
struct node2{
    int a;
    char b;
    struct node1 c;
    char d;
}test2;
struct node3{
    int a;
    char b[2];
    struct node1 c;
}test3;
union un1{
    char a[5];
    int i;
}u1;
struct node4{
    int a;
    char b[3];
    union un1 c;
}test4;
int main()
{
    cout << "int " << sizeof(int) << endl;
    cout << "short " << sizeof(short) << endl;
    cout << "char " << sizeof(char) << endl;
    cout << "long " << sizeof(long) << endl;
    cout << "double " << sizeof(double) << endl;
    cout << "test1 "<<sizeof(test1) << endl;
    cout << "test2 " << sizeof(test2) << endl;
    cout << "test3 " << sizeof(test3) << endl;
    cout << "u1 " << sizeof(u1) << endl;
    cout << "test4 " << sizeof(test4) << endl;
    system("pause");
    return 0;
}

 

以上是关于#pragma pack(n)的主要内容,如果未能解决你的问题,请参考以下文章

#pragma pack(push,1)与#pragma pack的区别(转)

#pragma pack (n) 设置对齐方式

高级C__attribute__((aligned(n))) 与 #pragma(pack(n))的区别

高级C__attribute__((aligned(n))) 与 #pragma(pack(n))的区别

GNU C字节对齐__attribute__((aligned(n))) #pragma pack(n)

#pragma pack(n)