类的sizeof值

本文详细解释了在C++中不同类结构的大小计算方式,包括空类、含有不同数据类型的类、含有成员函数的类以及包含虚函数的类。

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

代码:

  1. #include<iostream>
  2. using namespace std;
  3. class A
  4. {
  5. };
  6. class B
  7. {
  8. char a;
  9. int b;
  10. };
  11. class C
  12. {
  13. void foo(){};
  14. };
  15. class D
  16. {
  17. virtual void foo(){};
  18. };
  19. int main()
  20. {
  21. cout<<sizeof(A)<<sizeof(B)<<sizeof(C)<<sizeof(D);
  22. return 0;
  23. }
#include<iostream>
using namespace std;
class A
{

};
class B
{
  char a;
  int b;
};
class C
{
  void foo(){};
};
class D
{
  virtual void foo(){};
};
int main()
{
  cout<<sizeof(A)<<sizeof(B)<<sizeof(C)<<sizeof(D);
  return 0;
}


:结果是什么,为什么呢?

解答:sizeof(A)为1,而不是0,虽然空类没有任何成员变量,但其实体提供取地址操作,所以其内存空间不能为0。sizeof(B)为8,编译器在计算类体或结构体变量的地址时是通过字节对齐的方式进行的,也就是通过加多少偏移量来确认是那个变量。类的偏移量为其最大内存空间的类型的成员变量的长度,其最大内存空间类型成员是int,所以偏移量为4字节,即char a成员需要补上3个字节,才能让编译器准确高效地寻址,再加上int的4字节,sizeof(B)就是8了。sizeof(C)为1,类的成员函数在编译器编译时,其函数地址就已自动存放,所以不必为其分配额外的空间来存放他,所以它的长度跟空类一样为1。sizeof(D)为4,因为类D需要构造一虚函数列表来存放函数指针以实现动态调用,一个指针的长度占用4个字节,所以为4.

 

### 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]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值