c++中一个空类的行为
Behaviour of an empty class in c++
我写了一个小程序:
#include <iostream>
using namespace std;
class a{
};
int main ()
{
a *obj=new a();
cout<<sizeof(obj)<<endl;
cout<<sizeof(*obj)<<endl;
delete obj;
}
下面是我得到的输出:
> ./a.out
4
1
>
我可以理解它使用4个字节来存储对象的地址。但我不明白的是那1个字节。由于它是一个空类,我对这1个字节(对象大小(的用途有点怀疑。
我的第二个问题是会调用默认构造函数吗?如果是,它基本上会做什么?
字节之所以存在,是因为C++中对象的大小不能是0
。它是一个伪字节。想象一下a
的数组——如果a
的大小是0
,那么所有对象都将位于同一地址。
理论上,会调用一个空的默认构造函数。在实践中,它被优化了,因为它没有可观察的行为。
每个对象都必须有一个不同的地址,因此C++中的对象最小大小为1。
默认构造函数不执行任何操作。
1字节(对象大小(的用途是什么
在C++中,所有不同的对象都必须有不同的地址。为了实现这一点,所有对象都至少和最小的可寻址单元一样大,也就是一个字节。
我的第二个问题是会调用默认构造函数吗?
从技术上讲,是的。如果您没有声明自己的默认构造函数,那么如果需要,将隐式生成一个构造函数。隐式构造函数将默认构造所有成员和基子对象。然而
如果是,它基本上会做什么?
由于类没有需要初始化的成员或子对象,因此隐式构造函数是琐碎的:它什么都不做。
First sizeof
在32位系统中打印出32位指针的大小。第二个sizeof
打印出a
内容的大小,该内容与1字节对齐,因为不同的对象必须在不同的地址中创建。
然而,即使使用非虚拟方法,也可以拥有零大小的类:
class A
{
A()
{
cout << "Hi" << endl;
}
char unused[];
// Note: Putting at least a virtual method increases the size to 4 bytes.
};
和
cout << sizeof(A) << endl; // Prints out 0
此外,此代码显示所有A
对象都位于同一内存地址:
A a1;
A a2;
cout << &a1 << endl;
cout << &a2 << endl;
输出:
0x22ff00
0x22ff00
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 我在c++代码中生成了一个运行时#3异常
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 从链接列表c++中删除一个项目
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '