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<