空间开销模型源码

此源码参考编程珠玑附录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

 

posted @ 2014-03-19 13:01  lqj_piaohong  阅读(194)  评论(0编辑  收藏  举报