我是靠谱客的博主 犹豫冷风,最近开发中收集的这篇文章主要介绍C/C++中空结构体、空数组、空类的作用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1、sizeof是什么?

  • 对象类型的大小是在编译的时候直接确定的。
  • sizeof不是一个函数,而是一个返回对象类型大小的
  • 其作用是返回一个对象或类型所占的内存字节数。

如下例子可以运行通过:

int main()
{
int a = 12;
int b[sizeof(a)];
cout << sizeof(b)/sizeof(int) << endl;
return 0;
}
  • 在栈上定义数组只能是常量或者常量表达式,不能含有变量;
  • 在堆上定义数组可以含有变量。
int i = 10;
//在栈上定义
int nums1[10];
int nums2[10 + 2];
//在堆上定义
int* nums3 = new int[i];

2、一个对象的大小

一个类中,虚函数成员函数(包括静态与非静态)静态数据成员都是不占用类对象的存储空间的。

对象的大小 = vptr(指向虚函数表的指针)+ 所有非静态数据成员的大小 + Aligin字节大小(字节对齐)

3、为什么sizeof一个空类的结果为1?

类在实例化的过程中,都会获得一个独一无二的内存地址,为了达到这个目的,编译器往往会给空类隐含的增加一个字节(char),这样空类在实例化后的内存中得到了独一无二的地址。

4、为什么使用空类?

空类在“泛型编程”中,空类(空结构)的用处非常广:

我们利用类型(通常是空类),来区别对待不同类对象的属性。

通过使用函数重载的方法,在参数中加入一个空类来作为区分不同的函数的方法,编译的时候直接选择,而不是在运行的时候选择,是非常提高效率的。

5、空数组

空数组在结构体中不占空间,空数组名是一个指针(但是不占空间),它指向一个位置:

  • 在结构体中,指针指向前面一个成员结束后的第一个空间
  • 在非结构体中,指针指向的内容,与前一个对象的指针的内容一样。

如下例子,输出为8,即c这个空数组不占空间。

struct Test
{
int a;
char b;
char c[0];
};
int main()
{
cout << sizeof(Test) << endl; //输出为8
return 0;
}

6、类中的空数组

此时输出为1.

struct T
{
char c[0];
};
int main()
{
cout << sizeof(T) << endl; //输出为1
return 0;
}

7、为什么使用空数组?

问题:如果要给一个结构体添加一个缓冲区,要怎么做?

  1. 定义一个固定长度的buffer数组成员。但是这样buffer的大小会被锁死。
  2. 定义一个buffer指针,在构造函数中动态的创建一个需要大小的buffer。但是这样我们需要特别的管理这个空间,否则容易出现内存泄露,且一个buffer指针还占有了一个空间。
  3. 使用空数组来解决这个问题:

此时sizeof(T)的值为8,buffer[0]不占空间。而在申请空间的时候,加上buffer_len(缓冲区的长度),这样结构体和缓冲区就一起被申请了。这样的好处是结束的时候,可以调用free一起释放结构体和缓冲区,避免独立的管理结构体和缓冲区

sttuct  T
{
   int a;
   int b;
char buffer[0];
}; 
struct T* p=(T*)malloc(sizeof(T) +buffer_len);

 

最后

以上就是犹豫冷风为你收集整理的C/C++中空结构体、空数组、空类的作用的全部内容,希望文章能够帮你解决C/C++中空结构体、空数组、空类的作用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部