美文网首页
空类的大小

空类的大小

作者: hatlonely | 来源:发表于2019-11-27 20:54 被阅读0次

空类就是没有任何数据成员的类,这种类占用的内存大小在不同的语言里面有不同的实现

c

struct A {};

printf("sizeof(A): %lu\n", sizeof(struct A));
// sizeof(A): 0

这个结果输出是0,也就是说 c 语言中的空类大小为 0

struct A a1;
struct A a2;
printf("address(a1): %p\n", &a1);
printf("address(a2): %p\n", &a2);
printf("&a1 == &a2: %d\n", &a1 == &a2);
// address(a1): 0x7ffdead15ff0
// address(a2): 0x7ffdead15ff0
// &a1 == &a2: 0

在 gcc 中,两个空类拥有相同的地址,但是比较的结果却是不同的……这个我也不知道咋解释……

c++

class A {};

std::cout << "sizeof(A): " << sizeof(A) << std::endl;
// sizeof(A): 1

c++ 的空类大小为1,因为 c++ 中规定不同的对象必须拥有不同的地址,如果为0会导致两个空类的地址一样

class B {
    A a1;
    A a2;
};

std::cout << "sizeof(B): " << sizeof(B) << std::endl;
// sizeof(B): 2

空类作为成员,按照大小为 1 来处理

class C : public A {};

std::cout << "sizeof(C): " << sizeof(C) << std::endl;
// sizeof(C): 1

class D : public A {
    int i;
};

std::cout << "sizeof(D): " << sizeof(D) << std::endl;
// sizeof(D): 4

基类为空类不占空间,这个就是空白基类优化 EBO (empty base optimization)

golang

type A struct{}

fmt.Println("sizeof(A):", unsafe.Sizeof(A{}))
// sizeof(A): 0

golang 中空类的大小为 0

a1 := A{}
a2 := A{}
fmt.Printf("a1 == a2: %v\n", &a1 == &a2)
// a1 == a2: false

两个空类对象在栈上拥有不同的地址

a3 := A{}
a4 := A{}
fmt.Printf("address(a3): %p\n", &a3) // a3 逃逸到堆区
fmt.Printf("address(a4): %p\n", &a4) // a4 逃逸到堆区
fmt.Printf("a3 == a4: %v\n", &a3 == &a4)
// address(a3): 0x1190fd0
// address(a4): 0x1190fd0
// a3 == a4: true

调用 printf,a3、a4 逃逸到了堆区,在堆区拥有相同的地址

这个地方确实很怪,仅仅因为调用了一次 printf,导致 &a1 == &a2 的判断出现了不同的结果

总结

个人感觉 c++ 的设计不是很好,首先空类也占用一个字节的空间就是一件让人困惑的事情,所以不得不花很多篇幅去解释这个问题,还要去解决由这个问题引发的空类组合和继承的问题;另外对于空类是不是一定要有不同的地址来去区分不同的对象,这个场景在实际的生产中基本没有碰到过,就算是真的有这样的场景,也可以让用户自己增加成员变量去实现;最重要的,这样的设计会带来不必要的内存和性能的开销,而这种开销还不可避免

链接

转载请注明出处
本文链接:https://tech.hatlonely.com/article/58

相关文章

  • 空类的大小

    空类就是没有任何数据成员的类,这种类占用的内存大小在不同的语言里面有不同的实现 c 这个结果输出是0,也就是说 c...

  • sizeof 类的大小

    1. 空类大小 空类: 空类占用1个字节 运行的答案是: ** 这说明了空类所占用的空间为1, 单一继承的空类占用...

  • C++空类的大小

    C++的空类是指这个类不带任何数据,即类中没有非静态(non-static)数据成员变量,没有虚函数(virtua...

  • 【C++ Templates(19)】模板与继承

    空基类优化(EBCO) 布局原则 C++不允许类大小为0,比如数组元素为类,若类大小为0则数组大小也是0,这样会导...

  • 18 模板与继承

    空基类优化(EBCO) 布局原则 C++不允许类大小为0,比如数组元素为类时,若类大小为0则数组大小也是0,这会导...

  • 网易云课堂(Boolan)C++ 第四周笔记

    关于C++类的大小(size) 1. 空类 class AA{ }; #include int main() { ...

  • 4 - 类在内存中的表现,空类大小

    写个类,问在内存中如何存放,包括成员变量和各种函数存放的位置 https://www.cnblogs.com/re...

  • C++类大小和静态成员/方法

    类大小计算 空类的大小为1字节 一个类中,虚函数本身、成员函数(包括静态与非静态)和静态数据成员都是不占用类对象的...

  • c++面试问题总结

    1.c++面试问题总结:(1)空类的大小,仅含有虚函数类的大小(2)析构函数声明为虚函数的作用(3)C++多态的实...

  • 类的大小

    类的大小 考察类中各变量、函数的类型,通过表1、表2得到各类型所占空间,相加即为类的大小。 表1:影响类大小的因素...

网友评论

      本文标题:空类的大小

      本文链接:https://www.haomeiwen.com/subject/ddpmwctx.html