c++sizeof运算符是如何计算大小的
How does the c++ sizeof operator calculate size?
我创建了一个只有2个公共函数(构造函数和析构函数)的类X,使用sizeof
运算符,类大小将达到1。
当我将char
类型的私有数据成员添加到上面的类声明中时,大小仍然是1。最后,我添加了一个整数类型作为类数据成员,现在大小是8字节。
请向我解释一下班级人数是如何计算的。
首先,要意识到非虚拟函数对类的大小没有影响。
任何类的实例的大小至少为1字节,即使该类为空,这样不同的对象将具有不同的地址。
添加char
可以确保不同的对象具有不同的地址,因此编译器不会人为地在大小上添加一个地址。则大小为sizeof(char)
=1。
然后添加一个int
,它(可能)在您的平台上添加了4个字节。然后,编译器决定填充该类,以便出于性能/CPU要求的原因对其进行对齐,并添加3个空字节,以便大小现在为1+3+4=8。它可能会在int
成员之前添加填充,这样它就可以在4字节的边界上对齐,但除非CPU需要,否则不需要这样做
你可以在维基百科页面上阅读有关填充的内容。
在C++中,有许多因素决定类的对象的大小。这些因素是:
- 所有非静态数据成员的大小
- 数据成员的顺序
- 字节对齐或字节填充
- 其直接基类的大小
- 虚拟函数的存在(使用虚拟函数的动态多态性)
- 正在使用的编译器
- 继承模式(虚拟继承)
你可以在这里找到更多http://www.cprogramming.com/tutorial/size_of_class_object.html
相关文章:
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 如何在不使用乘除运算符的情况下计算 A 的 B 次幂?
- 是否允许三元运算符在C++中计算两个操作数?
- 计算校验和的逐位运算符
- c++ 如何计算赋值运算符(if 语句)
- 为什么按位运算符在使用与整数中提供的位数相同的位数计算可能的最大范围时会产生错误
- 我想知道我将如何实现 + 运算符重载.我已经从我上一个问题中计算出 += 运算符重载
- 运算符"|"如何计算两个整数?
- 为什么这个条件运算符的计算结果为 int?
- 为什么 if 语句对于运算符重载函数计算 false
- 我重载了一个运算符*()函数来计算两个矩阵的总和,但编译器提示此错误
- C++运算符和带枚举的计算结果为 false
- 使用条件运算符递归计算模板化值或函数时出现错误 C1202(堆栈溢出)
- C++:计算顺序运算符时忽略括号
- 编译器如何在c中计算sizeof运算符
- 如何重载加法运算符以进行交换计算
- 如何计算重载运算符在具有特定类型操作数的代码库中使用的次数
- 在c++lldb中使用重载运算符计算表达式
- C++ 中的逗号运算符不计算第二个表达式
- 如何计算前缀和后缀运算符的组合