struct class 指针变量 所占空间

  • 空类,空结构体,1Byte
  • 指针变量所占空间,8Bytes(64bits系统),4Bytes(32bits系统)
  • 类型所占空间 可能由于电脑系统不同而不同
  • struct类型 所占空间 并不是把结构体内所有变量所占空间加起来,机器为了更加容易的取出 struct 里面的数据,会将里面的 变量所占空间进行对齐。这是以空间换时间的一种方式。

例1:struct 所占空间 存储对齐

  • 首先,是每个变量的偏移量对齐,每一个变量相对于首地址的位置就是偏移量。
  • 其次,结构体的大小一定要是所占字节数最大的变量大小的整数倍。
#include

using namespace std;

typedef struct data {
    int a;      // 偏移0,4字节
} data;

typedef struct data0 {
    int a;      // 偏移0,4字节
    char b;     // 偏移4,1字节
} data0;

// 其中a的偏移量就是0,b的偏移量就是4,c的偏移量就是5,
// 以此类推。要进行对齐的话,该变量的偏移量一定要是该变量大小的整数倍。
// c的偏移量是5,对齐以后就会变成8,在变量b和c之间会穿插3个字节。
// 这就是每个变量的偏移量对齐了。
typedef struct data1 {
    int a;      // 偏移0,4字节
    char b;     // 偏移4,1字节
    double c;   // 偏移5,8字节
} data1;

typedef struct data2 {
    int a;      // int型变量的大小4个字节
    char b;     // char类型变量的大小1字节
    double c;   // double类型变量的大小8字节
    int d;
} data2;

int main() {
    cout << sizeof(data) << endl; // 4
    cout << sizeof(data0) << endl; // 4+1=5 -> 8
    cout << sizeof(data1) << endl; // 4+1=5 -> 8+8 -> 16
    cout << sizeof(data2) << endl; // 4+1=5 -> 8+8 -> 16+4=20 -> 24(8的倍数)
    return 0;
}

输出

4
8
16
24

例2:空 struct class & 一般 struct

#include

using namespace std;

class A {

};

struct B {

};

typedef struct list_t {
    struct list_t *next;
    struct list_t *prev;
    char data[0]; // char[0]是空数组,不占空间
} list_t;

typedef struct list_t1 {
    struct list_t *next; // 指针8个字节
    struct list_t *prev;
    char data[10]; // char[10] 10*1=10个字节
} list_t1;

int main() {

    cout << "A:" << sizeof(A) << endl; // 空类1个字节
    cout << "B:" << sizeof(B) << endl; // 空结构体1个字节
    cout << "list_t:" << sizeof(list_t) << endl; // 8+8=16
    cout << "list_t1:" << sizeof(list_t1) << endl; // 8+8=16 16+10=26->32(8的倍数)
    cout << endl;
}

输出

A:1
B:1
list_t:16
list_t1:32

例3:基本数据类型 & 指针类型

#include

using namespace std;

int main() {

    cout << "char: " << sizeof(char) << endl;
    cout << "int: " << sizeof(int) << endl;
    cout << "float: " << sizeof(float) << endl;
    cout << "double: " << sizeof(double) << endl;
    cout << endl;

    char data[10] = {0};
    cout << "char数组:" << sizeof(data) << endl; // 10个字节

    float *p;
    cout << "指针:" << sizeof(p) << endl; // 64位,指针变量8个字节
    return 0;
}

输出

char: 1
int: 4
float: 4
double: 8

char数组:10
指针:8

你可能感兴趣的:(struct class 指针变量 所占空间)