C++中类的大小计算方法总结

  C++中类的成员函数,静态成员是不占类的大小的。类的大小等于基类的大小+子类个non-static成员变量的大小再+非虚基类大小,如果有多态性还要考虑vptr(可能不止一个)大小,这里成员变量是会被字节对齐的。

1、空类的大小为1字节

2、字节对齐的问题 
        成员变量需要整齐的存储,所以若是有不同类型的变量(本身占用字节数不同),则所有变量的大小会按照最大的的大小进行补齐,比如说,若是一个类中有个bool型和int型,则bool型也会占用4个字节。若最大的为short,则bool型或者char型会补齐成为2个字节,最大的为double,则都补齐成为8字节。
        并且即使成员完全相同但排列不同计算出的类的大小也可能完全不同。
如下例:
一个类的大小可以被下面的方式改变:
class   A
{
 bool   a;
 int   b;
 bool   c;
};   //sizeof   (A)    12    
  这个结果可能会让你吃惊,因为A的成员总数是6个字节:1+4+1个字节。那另6字节是哪儿来的?编译器在每个bool成员后面都插入了3个填充字节以保证每个成员都是按4字节排列,以便分界。你可以减少A的大小,通过以下方式:  
class   B
{
 bool   a;
 bool   c;
 int   b;
};   //   sizeof   (B)    8      
  这一次,编译器只在成员c后插入了2个字节。因为b占了4个字节,所以就很自然地把它当作一个字的形式排列,而a和c的大小1+1=2,再加上2个字节就刚好按两个字的形式排列B。

3、虚函数:如果有虚函数,类的大小+4个字节。(用来存放vptr)
例:
class   A
{
           virtual   void   foo();
        int   i;
        char   c;
};   sizeof(A)   =   12   =   vptr   +   sizeof(i)   +   (sizeof(c)   +3);

class   B   :public   A
{
        void   foo1();
        static   int   haha;
        long       ll;
}   sizeof(B)   =   16   =   sizeof(A)   +   sizeof(ll);
4、虚基类指针:如果是虚继承,则子类的大小为:虚基类的大小 + 4个字节(用来存放指向虚基对象的指针)+子类新增成员的大小。
例: 
class A
{
  virtual    void    foo(){};
      int    i; 
  int j;
   
};
class C: virtual public A
{
      char    sz[10];
};sizeof(C)  = sizeof(A) + 4 +  sizeof(sz[10])  = 12+4+10+2(补齐sz)=28
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C 中可以使用动态内存分配的函数 malloc() 和 realloc() 来初始化大小未知的数组。例如,可以通过以下代码来动态分配一个大小未知的整数数组: int *arr; int size; printf("请输入数组大小:"); scanf("%d", &size); arr = (int*) malloc(size * sizeof(int)); 这样就可以根据用户输入的大小进行动态内存分配。而后如果需要扩展数组大小,可以使用 realloc() 函数实现。 但是,我们需要注意释放动态分配的内存。可以使用 free() 函数来释放内存: free(arr); ### 回答2: 在C语言中,我们可以使用动态内存分配来初始化大小未知的数组。动态内存分配允许我们在程序运行时根据需要分配和释放内存。 要初始化一个大小未知的数组,我们可以使用指针和malloc函数来实现。首先,我们需要声明一个指针变量来存储数组的地址。然后,我们可以使用malloc函数来分配所需大小的内存,并将分配的地址存储在指针变量中。最后,我们可以使用指针来访问和操作分配的内存。 下面是一个示例代码,演示如何初始化大小未知的数组: ```c #include <stdio.h> #include <stdlib.h> int main() { int size; int *arr; printf("请输入数组大小:"); scanf("%d", &size); // 使用malloc函数分配内存 arr = (int*) malloc(size * sizeof(int)); // 判断内存是否分配成功 if (arr == NULL) { printf("内存分配失败\n"); return 0; } // 初始化数组 for (int i = 0; i < size; i++) { arr[i] = i * 2; } // 打印数组 printf("初始化后的数组:\n"); for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } // 释放内存 free(arr); return 0; } ``` 在这个示例中,我们首先使用scanf函数从用户输入获取数组的大小。然后,我们使用malloc函数分配所需大小的内存,并将其转换为整型指针。在分配内存之后,我们可以像访问普通数组一样访问和操作指针变量`arr`。最后,记得在程序结束前使用free函数释放动态分配的内存。 总结起来,初始化大小未知的数组可以通过动态内存分配函数malloc来实现。我们需要使用指针变量来存储数组的地址,并根据需要分配和释放内存。 ### 回答3: 在C语言中,初始化大小未知的数组需要使用动态内存分配函数来实现,常用的函数是malloc()和calloc()。下面分别介绍这两个函数的使用方法: 1. 使用malloc()函数初始化大小未知的数组: malloc()函数可以为指定大小(以字节为单位)的内存块动态分配空间,并返回指向分配内存的指针。我们可以根据需要分配的元素个数和其数据型的大小计算所需的内存大小。具体代码如下: ``` #include <stdio.h> #include <stdlib.h> int main() { int n; printf("请输入数组的大小:"); scanf("%d", &n); int *arr = (int*)malloc(n * sizeof(int)); if (arr == NULL) { printf("内存分配失败。\n"); return 1; } // 对数组进行操作... free(arr); // 释放内存 return 0; } ``` 在上述示例中,用户输入数组的大小,然后使用malloc()函数动态分配内存空间,并将分配得到的指针赋值给arr指针变量。使用指针可以对动态分配的数组进行操作。最后使用free()函数释放内存。 2. 使用calloc()函数初始化大小未知的数组: calloc()函数与malloc()函数似,也可以用于动态分配内存空间,但不同之处在于它会将分配得到的内存空间初始化为0。使用方法与malloc()似,具体代码如下: ``` #include <stdio.h> #include <stdlib.h> int main() { int n; printf("请输入数组的大小:"); scanf("%d", &n); int *arr = (int*)calloc(n, sizeof(int)); if (arr == NULL) { printf("内存分配失败。\n"); return 1; } // 对数组进行操作... free(arr); // 释放内存 return 0; } ``` 在上述示例中,用户输入数组的大小,然后使用calloc()函数动态分配内存空间,并将分配得到的指针赋值给arr指针变量。使用指针可以对动态分配的数组进行操作。最后使用free()函数释放内存。 无论是使用malloc()还是calloc()函数初始化大小未知的数组,在使用完毕后都需要使用free()函数将其释放,以避免内存泄漏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值