C++ 空类和空结构体的大小为什么是1?

引言 

首先看两个小程序:

#include<stdio.h>
typedef struct A
{
	//int as;
}a;

int main()
{
	printf("%d\n",sizeof(a)); //输出 0
}
#include<iostream>
#include<cstdio>
using namespace std;
 
struct A{};
class B{};
 
int main(){
    printf("C++中空结构体内存大小是%d\n", sizeof(A));//输出 1
    printf("C++中空类内存大小是%d\n", sizeof(B)); //输出1
   
}

在C++,对于结构体和空类,它们的大小是1,在C语言下空结构体大小为0(当然这是编译器相关的)。这里的空类和空结构体是指类或结构体中没有任何成员。

为什么C++中的大小会是1?

C++标准中规定,任何不同的对象不能拥有相同的内存地址。 如果空类大小为0,当我们声明一个这个类的对象数组,那么数组中的每个对象都拥有了相同的地址,这显然是违背标准的。

那么,为什么C++标准中会有这个规定呢?

假设C++中有一个类型T,我们声明一个类型T的数组array,进行如下的运算:

T array[5];
int len = &array[4] - &array[0];//输出4

上面的代码是一种指针运算,将两个指针相减,编译器作出如下面式子所示的动作:

len= ((char *)&array[4] - (char *)&array[0]) / sizeof T;

如果允许C++对象大小为0,那么这里的运算将产生两个问题:

(1)能通过指针区分不同的数组对象
(2)sizeof T为0导致非法的除0操作

这样一来,编译器还需要用一些复杂的代码来处理这些异常情况信息。

总结

所以,为了满足C++标准规定的不同对象不能有相同地址,C++编译器保证任何类型对象大小不能为0。

C++编译器会在空类或空结构体中增加一个虚设的字节(有的编译器可能不止一个),以确保不同的对象都具有不同的地址。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值