常用变量占用内存的大小&&内存对齐方式&&#pragma pack

                   32位系统:     64位系统
类型              大小           大小
char               1             1
char *             4             8

int                4             4
int  *             4             8
short              2             2
short int          2             2
long               4             4
long int           4             4
long long          8             8
unsigned long long 8             8

double             8             8
long double        8             8

float              4             4

bool               1             1

自己写个代码运行一下就一目了然了

    cout << "char               " << sizeof(char) << endl;
    cout << "char *             " << sizeof(char*) << endl;
    cout << endl;
    cout << "int                " << sizeof(int) << endl;
    cout << "int *              " << sizeof(int*) << endl;
    cout << "short              " << sizeof(short) << endl;
    cout << "short *            " << sizeof(short*) << endl;
    cout << "short int          " << sizeof(short int) << endl;
    cout << "long               " << sizeof(long) << endl;
    cout << "long *             " << sizeof(long*) << endl;
    cout << "long int           " << sizeof(long int) << endl;
    cout << "long long          " << sizeof(long long) << endl;
    cout << "unsigned long long " << sizeof(unsigned long long) << endl;
    cout << endl;
    cout << "double             " << sizeof(double) << endl;
    cout << "double *           " << sizeof(double*) << endl;
    cout << "long double        " << sizeof(long double) << endl;
    cout << endl;
    cout << "float              " << sizeof(float) << endl;
    cout << "float *            " << sizeof(float*) << endl;
    cout << endl;
    cout << "bool               " <<sizeof(bool)<< endl;

指针类型变量32位系统占4个字节 64位系统占8个字节

举个栗子:

32位系统
int* a      sizeof(a)=4
int  a[4]   sizeof(a)=16//一个int占用4个位

64位系统
int* a      sizeof(a)=8
int  a[4]   sizeof(a)=16//一个int占用4个位

关于结构体字节对齐问题

struct Struct1
    {
        char a[10];
        char b[3];

    };
    cout <<"Struct1  "<< sizeof(Struct1) << endl;

输出的结果为 Struct1  13


struct Struct2
    {
        char a[10];
        double b[3];

    };
    cout << "Struct2  " << sizeof(Struct2) << endl;

输出的结果为 Struct2  40

关于结构体字节对齐原则

寻找结构体成员变量中占用内存空间最大的那个元素,以其地址的整数倍为单位。比如结构体有变量类型char int double,则计算时应该以double占用的字节数(8位)的整数倍为准,不够8的整数倍时会自动补齐。比如上面的结构体Struct2,char a[10]大小为10,double b[3]大小为24,手指头算了一下以为会是34,但是执行结果为40,其原理就是34以8对齐的最小上界整数是40,故执行结果为40。

关于#pragma pack

通过#pragma pack可以自己设定对齐方式,但是编译时会在#pragma pack设定的值和默认的值中选择最小的值作为对齐的单位

再举个栗子:

#pragma pack(2) 
struct Struct1
{
    char a[13];
};
cout <<"Struct1  "<< sizeof(Struct1) << endl;

输出结果为 Struct1  13

尽管我们自己设定的大小是2个字节,但是char默认是1个字节,所以取小的值为对齐的单位。
那大家猜猜下面的代码输出的结果会是什么?

#pragma pack(2) 
struct Struct1
{
    char a[13];
    int b;

};
cout <<"Struct1  "<< sizeof(Struct1) << endl;

如果你说出的答案是18,则恭喜你已经很好的理解了对齐方式了。
因为我们定义以2字节对齐,结构体默认的是以4字节对齐,选最小的整数2对齐,则结果当然是18而不是20啦。
看到一篇写的很好的文章分享给大家:5分钟搞定内存字节对齐

猜你喜欢

转载自blog.csdn.net/HelloCode1900/article/details/80949346
今日推荐