类数组总和、索引和计算
class arrays sums, indexes, and calculation
代码:
class B {
public:
B () : b(++bCounter) {}
int b;
static int bCounter;
};
int B::bCounter = 0;
class D : public B {
public:
D () : d(0) {}
int d;
};
const int N = 10;
B arrB[N];
D arrD[N];
int sum1 (B* arr) {
int s = 0;
for (int i=0; i<N; i++)
{
s+=arr[i].b;
}
return s;
}
int sum2 (D* arr) {
int s = 0;
for (int i=0; i<N; i++)
{
s+=arr[i].b+arr[i].d;
}
return s;
}
问题:
这些返回什么:
1( sum1(arrB)
=?
2( sum1(arrD)
=?
3( sum2(arrD)
=?
当我编译和运行这些时,我得到55,65和155,不知道为什么。我收集到在arrB中变量为b = 1,2,3,...,10,而在arrD b = 11,12,...,20中,所以我会回答sum1(arrB(= 55和sum1(arrD(= 155,总和为11 + 12 +。+20,而sum2(arrD(=155,因为到处都是d=0。
我做错了什么?
你正在得到对象切片。您正在将D*
数组传递到采用B*
数组的函数中。 D
最初比B
大。
每次执行s+=arr[i].b;
时,您都会将指针移动 B 的大小,而您需要将其移动 D 的大小,因此在每次迭代后,指针不会向前移动一个项目。
[TheBPart|TheDPart][TheBPart|TheDPart][TheBPart|TheDPart]
^
|
iteration 0
[TheBPart|TheDPart][TheBPart|TheDPart][TheBPart|TheDPart]
^
|
iteration 1
[TheBPart|TheDPart][TheBPart|TheDPart][TheBPart|TheDPart]
^
|
iteration 2
[TheBPart|TheDPart][TheBPart|TheDPart][TheBPart|TheDPart]
^
|
iteration 3
在您的特定情况下发生的情况是,在每次奇数迭代之后,它都指向D
类对象的中间某个位置。这只是因为D
正好是B
的两倍,否则行为会有所不同。
问题在于将arrD
转换为arrB
。B 的大小为 4 个字节,而 D 的大小为 8 个字节。
当您将 D* 转换为 B* 时,您实际上每次迭代跳入内存 4 个字节而不是 8 个字节。 如果我们一次占用 4 个字节,arrD 将在内存中保存以下值
11 // arrD[0].b
0 // arrD[0].d
12 // arrD[1].b
0 // arrD[1].d
13 // arrD[2].b
0 // arrD[2].d
14 // arrD[3].b
0 // arrD[3].d
15 // arrD[4].b
0 // arrD[4].d
16 // arrD[5].b
0 // arrD[5].d
17 // arrD[6].b
0 // arrD[6].d
18 // arrD[7].b
0 // arrD[7].d
19 // arrD[8].b
0 // arrD[8].d
20 // arrD[9].b
0 // arrD[9].d
现在,当您一次总结 4 个字节时,您将取其前 10 个值。因此,您的结果是:11+0+12+0+13+0+14+0+15+0 = 65
从类似的推理中,您可以知道结果的原因 sum2
.
相关文章:
- 如何计算 3d 数组中的索引值在内存中的位置?如何计算字符**中的索引值在内存中的位置?
- 数组中每个段的推力 CUDA 计算索引
- 使用元编程进行高效的索引计算
- 从右到左计算当前索引中的数据结构中的元素数,并打印每个元素的计数
- 如何计算特定的卡组合索引
- 是否有C 功能来计算两个索引之间的距离
- 通过查找重复顶点从 vec3 对象的向量计算索引
- 高效计算两个向量公共元素的索引
- 在计算使用了多少个数组索引的同时,如何填充一个来自用户输入的字符的数组?(使用cin.get)
- 如何使用二进制索引树来计算小于索引值的元素数量
- 类数组总和、索引和计算
- DX11计算着色器只写入一个索引
- 更好的折叠循环索引计算
- 计算树结构中树叶的索引
- 有效地计算字典排序中特定元素的索引
- 对角扁平矩阵的邻域索引计算
- 对于循环数组迭代,if循环测试索引是否为真/假,计算结果不正确
- 最有效的计算字典索引的方法
- 如何在使用thrust::lower_bound()计算VBO索引时克服内存限制
- 如何计算网格索引