Skip to the content.

sizeof(struct)是多少

Contact me


C++代码:

#include <iostream>

struct Test {};

int main()
{
    Test t;
    std::cout << sizeof(t);
}

运行(64位系统)结果是多少?1,为什么?C++为了标志一个空的类,让空的类依旧有1个字节的空间,这样当我们写这个类的数组的时候,就不会出现长度为0的情况了。

但是如果你运行C代码:

#include <stdio.h>

struct Test {};

int main() {
    struct Test t;
    printf("%d", sizeof(t));
}

结果是多少?0,为什么?C没有为空的结构体标志为1,直接是0,那么我们就发现:

struct Test t[3];

的长度是0。非常有趣,这也是C和C++的一个区别。

我们继续探究C++:

include <iostream>

struct Test {
    char c;
    int i;
};

int main()
{
    Test t;
    std::cout << sizeof(t);
}

结果是多少?8,为什么?这是因为内存对齐,可以参考这篇文章

type2

#include <iostream>

struct Test {
    void fun() {};
};

int main()
{
    Test t;
    std::cout << sizeof(t);
}

结果是多少?1,为什么?普通函数和类不放在一起,因此类里面的普通函数不占类的空间。

为啥说普通函数,看这个:

#include <iostream>

struct Test {
    virtual void fun() {};
    virtual void fun2() {};
};

int main()
{
    Test t;
    std::cout << sizeof(t);
}

结果是多少?8,为什么?这个函数是虚函数,不是普通函数,因此占内存一个指针的长度。因为是64位,所以是8个字节的指针。

sizeof-class-1

#include <iostream>

struct Test {
    static int i;
};

int main()
{
    Test t;
    std::cout << sizeof(t);
}

结果是多少?1,为什么?静态成员和类不在一起,所以也不占类的空间。