为什么空类的大小是1

我们可能都知道,C++中空类的大小是1。

#include <iostream>

class EmptyA {};

int main() {
    std::cout << "sizeof EmptyA " << sizeof(EmptyA) << std::endl;
    return 0;
};

结果如下:

sizeof EmptyA 1

然而在C语言中空结构体的大小是0,空结构体大小是0我们貌似可以理解,但为什么到C++中,空类的大小却是1呢?

原因如下:

实际上,这是类结构体实例化的原因,空的类或结构体同样可以被实例化,如果定义对空的类或者结构体取sizeof()的值为0,那么该空的类或结构体实例化出很多实例时,在内存地址上就不能区分该类实例化出的实例,所以,为了实现每个实例在内存中都有一个独一无二的地址,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址,所以空类所占的内存大小是1个字节。

 如果现在有这样一种情况

#include <iostream>

class EmptyA {};

class B : public EmptyA {
    int b;
};

int main() {
    std::cout << "sizeof B " << sizeof(B) << std::endl;
    return 0;
};

结果如下 

sizeof B 4

我们可以看到,B并没有继承空类A的1个字节的大小,这是因为继承空类会给子类产生额外的大小,所以子类如果继承空类,并不会产生额外的大小,它的大小还是子类本身的大小。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 可以使用以下工具类来判断对象是否为空: ```java public class ObjectUtils { private ObjectUtils() {} /** * 判断对象是否为null */ public static boolean isNull(Object object) { return object == null; } /** * 判断对象是否不为null */ public static boolean isNotNull(Object object) { return !isNull(object); } /** * 判断对象是否为空,包括null、""、" " */ public static boolean isEmpty(Object object) { if (isNull(object)) { return true; } if (object instanceof CharSequence) { return ((CharSequence) object).length() == 0; } if (object instanceof Collection) { return ((Collection) object).isEmpty(); } if (object instanceof Map) { return ((Map) object).isEmpty(); } if (object instanceof Object[]) { Object[] objectArray = (Object[]) object; if (objectArray.length == 0) { return true; } boolean empty = true; for (Object obj : objectArray) { if (!isEmpty(obj)) { empty = false; break; } } return empty; } return false; } /** * 判断对象是否不为空,包括null、""、" " */ public static boolean isNotEmpty(Object object) { return !isEmpty(object); } } ``` 其中,`isNull`方法用于判断对象是否为null,`isNotNull`方法用于判断对象是否不为null,`isEmpty`方法用于判断对象是否为空,包括null、""、" ",`isNotEmpty`方法用于判断对象是否不为空,包括null、""、" "。 ### 回答2: 判断对象为空的工具类主要目的是判断一个对象是否为空,下面是一个简单实现的例子: ``` public class ObjectUtil { /** * 判断一个对象是否为空 * @param obj 待判断的对象 * @return true表示对象为空,false表示对象不为空 */ public static boolean isEmpty(Object obj) { if (obj == null) { return true; } // 如果对象为字符串类型,则判断字符串是否为空 if (obj instanceof String) { String str = (String) obj; return str.trim().length() == 0; } // 如果对象为数组类型,则判断数组长度是否为0 if (obj.getClass().isArray()) { return Array.getLength(obj) == 0; } // 如果对象为集合类型,则判断集合大小是否为0 if (obj instanceof Collection) { Collection<?> collection = (Collection<?>) obj; return collection.isEmpty(); } // 如果对象为Map类型,则判断Map大小是否为0 if (obj instanceof Map) { Map<?, ?> map = (Map<?, ?>) obj; return map.isEmpty(); } return false; } } ``` 这个工具类的`isEmpty`方法接收一个参数对象,通过判断对象的类型和属性来判断是否为空。首先判断对象是否为null,若为null则返回true表示对象为空。接着判断对象的类型,如果是字符串类型,则去除两端的空格后判断长度是否为0;如果是数组类型,则判断数组长度是否为0;如果是集合类型,则判断集合大小是否为0;如果是Map类型,则判断Map大小是否为0。 ### 回答3: 判断对象为空的工具类主要是为了方便开发人员在编写代码时能够快速、准确地判断一个对象是否为空,避免因为空指针而引发的异常。 工具类的核心方法是isEmpty,其主要逻辑如下: 1. 首先,判断对象是否为null,如果是,则返回true,表示对象为空; 2. 其次,判断对象是否为字符串类型,如果是,进一步判断其是否为空字符串,如果是,则返回true,表示对象为空; 3. 如果对象不是null也不是字符串类型,进一步判断其是否为集合类型,如果是,判断其是否为空集合,如果是,则返回true,表示对象为空; 4. 如果对象既不是null也不是字符串类型也不是集合类型,那么判断其是否为数组类型,如果是,进一步判断其长度是否为0,如果是,则返回true,表示对象为空; 5. 如果以上都不满足,则返回false,表示对象不为空。 该工具类还可以扩展其他的判断逻辑,例如判断数组、集合等对象的元素是否为空。 使用该工具类可以简化代码,提高代码可读性和可维护性。例如,在进行对象判空时,只需要调用isEmpty方法即可,无需编写冗长的判断逻辑。同时,该工具类还可以辅助编写单元测试,以确保对象判断为空的逻辑正确性。 总之,判断对象为空的工具类在开发中具有较高的实用性和可扩展性,能够提高开发效率和代码质量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值