C ++:获取类实例的大小

时间:2016-05-24 05:46:45

标签: c++ class sizeof

在编写标题并对其进行测试(很多)之后,我想知道这个标题的效率是多少。标题基本上做的是尽可能有效地存储地图。 Map.SetValue()存储坐标,Map.GetValue获取坐标。坐标存储在一个二维向量中,其中四个值存储在一个char中(每个值有四种可能性)。

我尝试使用以下代码来获取类的大小:

int main()
{
    MapStorage Map;

    int Coords[2];
    int Value;
    int Size;
    float Efficiency;

    for (int i = 0; i < 100; i += 1){
        for (int x = 0 + 10*i; x < 10 + 10*i; x += 1){
            for (int y = 0; y < 10; y += 1){
                Coords[0] = x;
                Coords[1] = y;
                Value = rand()%4;
                Map.SetValue(Coords, Value);
            }
        }

        Size = sizeof(Map);
        Efficiency = Size/float(i+1);

        std::cout << "Size at " << i+1 << " Square meters: " << Size << ", Effficiency: " << Efficiency << std::endl;
    }

    return 0;
}

(MapStorage Map生成类实例,因为MapStorage是类的名称)

但是会发生这样的情况,即始终打印尺寸为20字节,而在i = 99时,尺寸应至少为2,5kb(100平方米,每平方米100个值,100 * 100 = 10 000,每字节4个值,10 000/4 = 2 500个字节)。

问题是:我做错了什么?我不明白sizeof的工作原理,或者它是否与类不同?我做了一些搜索同样问题的其他人,但我找不到适用于我的问题的解决方案。

亲切的问候, 害

注释:
我将地图存储为unsigned char类型的2D向量。它没有被声明为静态。

1 个答案:

答案 0 :(得分:1)

请注意sizeof是编译时,而不是运行时。编译时计算的表达式将由编译器替换为sizeof的结果。这就是原因,你可以这样做:

char bytes [ sizeof(int) ];

将替换为(如果编译器/平台上int的大小为4):

char bytes [ 4 ];