class的sizeof

本文通过实例探讨了C++中类的大小是如何确定的,包括空类、含虚函数的类及多重继承类的大小,并解释了编译器如何进行调整以提高内存访问效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

程序执行的输出结果为:

sizeof(a) =1

sizeof(b)=1

sizeof(c)=4

sizeof(d)=8

为什么会出现这种结果呢?初学者肯定会很烦恼是吗?类a,b明明是空类,它的大小应该为为0,为什么 编译器输出的结果为1呢?这就是我们刚才所说的实例化的原因(空类同样可以被实例化),每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址.所以a,b的大小为1.

而类c是由类a派生而来,它里面有一个纯虚函数,由于有虚函数的原因,有一个指向虚函数的指针(vptr),在32位的系统分配给指针的大小为4个字节,所以最后得到c类的大小为4.

类d的大小更让初学者疑惑吧,类d是由类b,c派生迩来的,它的大小应该为二者之和5,为什么却是8  呢?这是因为为了提高实例在内存中的存取效率.类的大小往往被调整到系统的整数倍.并采取就近的法则,里哪个最近的倍数,就是该类的大小,所以类d的大小为8个字节.

当然在不同的编译器上得到的结果可能不同,但是这个实验告诉我们初学者,不管类是否为空类,均可被实例化(空类也可被实例化),每个被实例都有一个独一无二的地址.

我所用的编译器为vc++ 6.0


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lenic/archive/2009/05/18/4199114.aspx 

### sizeof 的定义与用途 `sizeof` 是一种运算符,在多种编程语言中用于获取数据类型的大小(以字节为单位)。它通常被用来计算变量、数组或其他数据结构所占用的内存空间。 #### 在 C/C++ 中 `sizeof` 的基本用法 在 C 和 C++ 编程语言中,`sizeof` 运算符返回指定类型或对象所需的存储量。其语法如下: ```cpp size_t size = sizeof(type); ``` 或者对于已声明的对象: ```cpp size_t size = sizeof(object); ``` 这里的关键点在于,`sizeof` 返回的是编译期常量,因此它的值是在程序运行之前就确定下来的[^2]。 #### 示例代码展示 `sizeof` 使用方法 下面是一个简单的例子,展示了如何使用 `sizeof` 来测量不同类型的数据所需的空间: ```cpp #include <iostream> int main() { int integerVariable; double floatingPointVariable; std::cout << "Size of an integer: " << sizeof(integerVariable) << " bytes\n"; std::cout << "Size of a double precision float: " << sizeof(floatingPointVariable) << " bytes\n"; // 测量自定义结构体的大小 struct ExampleStruct { char c; long l; }; std::cout << "Size of the structure 'ExampleStruct': " << sizeof(ExampleStruct) << " bytes\n"; return 0; } ``` 这段代码演示了不同数据类型以及复杂结构体的尺寸测量方式[^2]。 #### Java 中实现类似的 `sizeof` 功能 尽管 Java 并未提供内置的 `sizeof` 关键词,但可以通过第三方库或手动估算的方式来模拟这一功能。由于 JVM 对象的实际内存消耗可能受到垃圾回收机制的影响而变化不定,精确计算并非易事。然而,可以借助一些工具类完成近似估计。 以下是通过反射技术粗略统计实例字段总和的一个简单版本: ```java import java.lang.reflect.Field; import java.util.ArrayList; public class SizeOf { public static void main(String[] args) throws IllegalAccessException { ArrayList<Integer> list = new ArrayList<>(); for (int i=0;i<1000;i++) { list.add(i); } System.out.println("Estimated memory usage by List: "+getSize(list)+" bytes"); } @SuppressWarnings("rawtypes") public static long getSize(Object o) throws IllegalAccessException { Class clazz = o.getClass(); Field[] fields = clazz.getDeclaredFields(); long totalSize = 0L; for(Field field : fields){ field.setAccessible(true); if(field.getType().isPrimitive()){ switch (field.getName()) { case "boolean": totalSize += 1; break; case "byte": totalSize += 1; break; case "char": totalSize += 2; break; case "short": totalSize += 2; break; case "int": totalSize += 4; break; case "long": totalSize += 8; break; case "float": totalSize += 4; break; case "double": totalSize += 8; break; } }else{ Object objValue = field.get(o); if(objValue != null && !objValue.getClass().getName().startsWith("java")){ totalSize += getSize(objValue); } } } return totalSize; } } ``` 注意该算法仅适用于特定场景下的简化模型,并不完全反映真实情况[^1]。 ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值