C++:获取 class 实例的大小
C++: Get size of class instance
在写了一个 header 并测试了它(很多)之后,我想知道这个 header 的效率是多少。 header 基本上所做的是尽可能高效地存储地图。 Map.SetValue() 存储坐标,Map.GetValue 获取坐标。坐标存储在二维向量中,其中四个值存储在一个字符中(每个值有四种可能性)。
我尝试使用以下代码获取 class 的大小:
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 生成 class 实例,因为 MapStorage 是 class 的名称)
但是发生的是,这总是打印大小为 20 字节,而在 i = 99 时,大小应至少为 2,5kb(100 平方米,每平方米 100 个值,100*100 = 10 000,每字节 4 个值,10 000/4 = 2 500 字节)。
问题是:我做错了什么?我不明白 sizeof 是如何工作的,还是它与 classes 的工作方式不同?我搜索了其他有同样问题的人,但找不到适用于我的问题的解决方案。
亲切的问候,
伤害
备注:
我将地图存储为 unsigned char 类型的二维向量。它没有声明为静态的。
请注意 sizeof
是编译时,而不是运行时。编译时计算的表达式将被编译器替换为 sizeof
的结果。这就是原因,您可以这样做:
char bytes [ sizeof(int) ];
将替换为(如果 compiler/platform 上 int
的大小是 4
):
char bytes [ 4 ];
在写了一个 header 并测试了它(很多)之后,我想知道这个 header 的效率是多少。 header 基本上所做的是尽可能高效地存储地图。 Map.SetValue() 存储坐标,Map.GetValue 获取坐标。坐标存储在二维向量中,其中四个值存储在一个字符中(每个值有四种可能性)。
我尝试使用以下代码获取 class 的大小:
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 生成 class 实例,因为 MapStorage 是 class 的名称)
但是发生的是,这总是打印大小为 20 字节,而在 i = 99 时,大小应至少为 2,5kb(100 平方米,每平方米 100 个值,100*100 = 10 000,每字节 4 个值,10 000/4 = 2 500 字节)。
问题是:我做错了什么?我不明白 sizeof 是如何工作的,还是它与 classes 的工作方式不同?我搜索了其他有同样问题的人,但找不到适用于我的问题的解决方案。
亲切的问候, 伤害
备注:
我将地图存储为 unsigned char 类型的二维向量。它没有声明为静态的。
请注意 sizeof
是编译时,而不是运行时。编译时计算的表达式将被编译器替换为 sizeof
的结果。这就是原因,您可以这样做:
char bytes [ sizeof(int) ];
将替换为(如果 compiler/platform 上 int
的大小是 4
):
char bytes [ 4 ];