概述
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、为什么使用空数组?
问题:如果要给一个结构体添加一个缓冲区,要怎么做?
- 定义一个固定长度的buffer数组成员。但是这样buffer的大小会被锁死。
- 定义一个buffer指针,在构造函数中动态的创建一个需要大小的buffer。但是这样我们需要特别的管理这个空间,否则容易出现内存泄露,且一个buffer指针还占有了一个空间。
- 使用空数组来解决这个问题:
此时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++中空结构体、空数组、空类的作用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复