空间开销模型源码
此源码参考编程珠玑附录C时空开销源码例一。改动在于用template代替Macro。
Measure 方法:连续new类型T十二次,查看系统为每一个对象分配的实际大小。
结论:在64位的机器上,如果类型大小小于等于4字节,则分配64字节的空间。如果类型大小大于4字节,则最低分配72字节,以后每多出8字节,就分配多8字节。
#include "stdafx.h" #include <iostream> using namespace std; template <class T> void MEASURE() { cout << typeid(T).name() << "\t"; cout << sizeof(T) << "\t"; int lastp = 0; for (int i = 0; i < 11; i++) { T *p = new T; int thisp = (int) p; if (lastp != 0) cout << " " << thisp - lastp; lastp = thisp; } cout << "\n"; } template <int i> struct structii { char c[i]; }; int main() { cout << "Raw sizeof"; cout << "\nsizeof(char)=" << sizeof(char); cout << " sizeof(short)=" << sizeof(short); cout << " sizeof(int)=" << sizeof(int); cout << "\nsizeof(float)=" << sizeof(float); cout << " sizeof(struct *)=" << sizeof(structii<1> *); cout << " sizeof(long)=" << sizeof(long); cout << "\nsizeof(double)=" << sizeof(double); cout << "\n\nMEASURE\n"; MEASURE<structii<1>>(); MEASURE<structii<2>>(); MEASURE<structii<3>>(); MEASURE<structii<4>>(); MEASURE<structii<5>>(); MEASURE<structii<6>>(); MEASURE<structii<7>>(); MEASURE<structii<8>>(); MEASURE<structii<9>>(); MEASURE<structii<10>>(); MEASURE<structii<11>>(); MEASURE<structii<12>>(); MEASURE<structii<13>>(); MEASURE<structii<14>>(); MEASURE<structii<15>>(); MEASURE<structii<16>>(); MEASURE<structii<17>>(); MEASURE<structii<18>>(); MEASURE<structii<19>>(); MEASURE<structii<20>>(); MEASURE<structii<21>>(); MEASURE<structii<22>>(); MEASURE<structii<23>>(); MEASURE<structii<24>>(); MEASURE<structii<25>>(); MEASURE<structii<26>>(); MEASURE<structii<27>>(); return 0; }
Output on my machine:x64
Raw sizeof sizeof(char)=1 sizeof(short)=2 sizeof(int)=4 sizeof(float)=4 sizeof(struct *)=4 sizeof(long)=4 sizeof(double)=8 MEASURE struct structii<1> 1 12904 -9184 9616 64 64 64 368 64 64 64 struct structii<2> 2 64 64 64 64 64 64 64 64 64 64 struct structii<3> 3 64 64 64 64 64 64 64 64 64 64 struct structii<4> 4 64 64 64 64 64 64 64 64 64 64 struct structii<5> 5 72 72 72 72 72 72 72 72 72 72 struct structii<6> 6 72 72 72 72 72 72 72 72 72 72 struct structii<7> 7 72 72 72 72 72 72 72 72 72 72 struct structii<8> 8 72 72 72 72 72 72 72 72 72 72 struct structii<9> 9 72 72 72 72 72 72 72 72 72 72 struct structii<10> 10 72 72 72 72 72 72 72 72 72 72 struct structii<11> 11 72 72 72 72 72 72 72 72 72 72 struct structii<12> 12 72 72 72 72 72 72 72 72 72 72 struct structii<13> 13 80 80 80 80 80 80 80 80 80 80 struct structii<14> 14 80 80 80 80 80 80 80 80 80 80 struct structii<15> 15 80 80 80 80 80 80 80 80 80 80 struct structii<16> 16 80 80 80 80 80 80 80 80 80 80 struct structii<17> 17 80 80 80 80 80 80 80 80 80 80 struct structii<18> 18 80 80 80 80 80 80 80 80 80 80 struct structii<19> 19 80 80 80 80 80 80 80 80 80 80 struct structii<20> 20 80 80 80 80 80 80 80 80 80 80 struct structii<21> 21 88 88 88 88 88 88 88 88 88 88 struct structii<22> 22 88 88 88 88 88 88 88 88 88 88 struct structii<23> 23 88 88 88 88 88 88 88 88 88 88 struct structii<24> 24 88 88 88 88 88 88 88 88 88 88 struct structii<25> 25 88 88 88 88 88 88 88 88 88 88 struct structii<26> 26 88 88 88 88 88 88 88 88 88 88 struct structii<27> 27 88 88 88 88 88 88 88 88 88 88