c++ 对象大小内存占用分析


由于是64位机器,因此以下分析中指针都是占用64位

#include
using namespace std;

// 1 空类对象
// sizeof emptyObj=1
class emptyClass{};

// 2 普通成员函数对象
// sizeof generalObj = 1
class hasGeneralFuntionClass{
    public:
    void show(){ cout<<" show()"< vectorObj;

// 6 list对象
// sizeof listObj=24, 因为有2个指针+一个size_t
// _List_node_base *_M_next;  // 前指针
// _List_node_base *_M_prev;  // 后指针
// std::size_t _M_size;       // 节点个数
list listObj;

// 7 forwardlist 对象
// sizeof forwardListObj= 8 : 仅有一个next指针
forward_list forwardListObj;

// 8 deque 对象
// sizeof deque = 80  :(4+4+2)*8=80
// 2 
// _Map_pointer _M_map;   指向map:记录元素存放的桶位置
// size_t _M_map_size;    map的大小:桶的个数

// ( 指向下面四个_M_cur,_M_first,_M_last,_M_node
// iterator _M_start;     第一个节点的位置:
// iterator _M_finish;    最后一个节点的下一个位置:
// )

// 4
// _Elt_pointer _M_cur;
// _Elt_pointer _M_first;
// _Elt_pointer _M_last;
// _Map_pointer _M_node;
deque dequeObj;


// 9 stack 对象
// sizeof stackObj = 80, 基于deque实现,因此是dequeue的大小
stack stackObj;

// 10 queue 对象
// sizeof queueObj = 80, 基于deque实现,因此是dequeue的大小
queue queueObj;

// 11 rb_tree 对象
// sizeof rbTreeObj = 48
// _Rb_tree_color	_M_color;                   枚举bool值《-》需要对齐
// _Base_ptr		_M_parent;                  指向父节点的指针
// _Base_ptr		_M_left;                    指向左孩子的指针
// _Base_ptr		_M_right;                   指向右孩子的指针
// size_t		_M_node_count               节点数量
// __gnu_cxx::__aligned_membuf<_Val> _M_storage 存放数据的指针
_Rb_tree> rbTreeObj;

// 12 map 对象
// sizeof mapObj = 48 map和set的底层数据结构就是红黑树,因此大小为48
map iMap;

// 13 set 对象
// sizeof msetObj = 48 map和set的底层数据结构就是红黑树,因此大小为48
set iSet;

// 14 hashtable        <-这儿的分析还有待大佬修正,由于visiual studio 坏了,一时间分析看不到内存
// size of hashTableObj=56
// __bucket_type *_M_buckets = &_M_single_bucket;
// size_type _M_bucket_count = 1;
// __node_base _M_before_begin;-->*next,*cur,val空间指针
// size_type _M_element_count = 0;
// _RehashPolicy _M_rehash_policy;

// 15 unorderd_map、unorderd_set 对象
// sizeof uiMap = 56, 因为底层是依靠hashtable实现的
unordered_map uiMap;

int main(){
    // class size
    emptyClass emptyObj;
    hasGeneralFuntionClass generalObj;
    hasVirtualFunctionClass virtualObj;
    cout<