c++中类对象的大小
Size of class object in C++
根据什么显示类对象的大小为12?
class testvector
{
public : vector<int> test;
};
int main()
{
testvector otestvector;
cout<<"size :"<<sizeof(otestvector)<<"n";
cout<<"size of int :"<<sizeof(int);
}
输出:size :12
size of int :4
可以这样想。让我们假设标准c++库没有vector
类。于是你决定生个孩子是个好主意。
你可能,至少,会想出这样的东西。(免责声明:c++的实际vector类远比复杂)
template <class T>
class vector
{
T* items; // array of items
size_t length; // number of items inserted
size_t capacity; // how many items we've allocated
public:
void push_back(const T& item) {
if (length >= capacity) {
grow(length * 2); // double capacity
}
items[length] = item;
length++;
}
...
};
让我们在32位系统上分解一个简单向量类的实例:
sizeof(items) == 4 // pointers are 4 bytes on 32-bit systems
sizeof(length) == 4; // since size_t is typically a long, it's 32-bits as well
sizeof(capacity) == 4; // same as above
一开始就有12个字节的成员变量。所以我的简单例子是sizeof(vector<T>) == 12
。不管T
是什么类型。sizeof()操作符只考虑成员变量,而不考虑与每个成员变量相关的堆分配。
以上只是一个粗略的例子。实际的vector类具有更复杂的结构,支持自定义分配器,并对有效的迭代、插入和删除进行了其他优化。因此,类中可能有更多的成员变量。
所以至少,我的最小例子已经有12字节长了。在64位编译器上可能是24字节,因为sizeof(pointer)和sizeof(size_t)在64位编译器上通常是double。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- 使用std::函数映射对象方法
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 构造对象的歧义
- 使用"std::unordereded_map"映射到"std::list"对象