【发布时间】:2017-08-20 18:12:21
【问题描述】:
我想举一个最小的例子。如果提供的代码还不够,请告诉我您还需要什么。这不是什么超级秘密;)
考虑以下两种实现:
使用 3d 数组:
.h
class Grid
{
public:
Grid();
uint8_t get(int x, int y, int z);
void set(int x, int y, int z, uint8_t value);
private:
uint8_t blocks[Chunk::width][Chunk::height][Chunk::depth];
};
.cpp
Grid::Grid()
{
memset(blocks, 0, sizeof(blocks));
}
uint8_t Grid::get(int x, int y, int z)
{
return blocks[x][y][z];
}
void Grid::set(int x, int y, int z, uint8_t value)
{
blocks[x][y][z] = value;
}
现在是一维数组:
.h
class Grid
{
public:
Grid();
uint8_t get(int x, int y, int z);
void set(int x, int y, int z, uint8_t value);
private:
uint8_t blocks[Chunk::width * Chunk::height * Chunk::depth];
int to1D(int x, int y, int z) { return x + (y * Chunk::width) + (z * Chunk::width * Chunk::height); }
};
.cpp
Grid::Grid()
{
memset(blocks, 0, sizeof(blocks));
}
uint8_t Grid::get(int x, int y, int z)
{
return this->blocks[x + (y * Chunk::width) + (z * Chunk::width * Chunk::height)];
}
void Grid::set(int x, int y, int z, uint8_t value)
{
this->blocks[x + (y * Chunk::width) + (z * Chunk::width * Chunk::height)] = value;
}
现在有了 3D 版本,一切都像魅力一样,而 对于相同的整体尺寸我得到了一个
摘要:AddressSanitizer:Grid::get(int, int, int) 中的 heap-buffer-overflow src/Grid.cpp:16
我真的很想知道为什么会这样。两种实现都持有uint8_ts...我似乎看不到/掌握的 3d-array 版本中的优化是什么?
(是的,这是一个 minecrafty 体素引擎实验;))
【问题讨论】:
-
宽度、高度和深度的值有多大?
-
跟进@Ronin,你的代码会因为 x/y/z 的小值而崩溃吗?
-
你从来没有说过你用什么值来调用
Grid::get。 -
你的 IDE(编程环境和编译器)是什么,你遇到了什么错误?
-
每个值都是 16。不过有很多网格
标签: c++ arrays buffer-overflow