当我做到以下几点:未处理的异常
float name[512][512][3]
我得到这个大错误,使我打破。我正在使用Visual Studio。
我注意到简单地把“静态”放在前面导致错误消失,但我希望这是一个实例字段。我不知道为什么会发生这种情况 - 阵列不是那么大,而且我有一台功能强大的机器。
尝试[512] [512]打破了我,但[256] [512]是完全没问题的。
我在我的智慧结尾!请帮助:)
当我做到以下几点:未处理的异常
float name[512][512][3]
我得到这个大错误,使我打破。我正在使用Visual Studio。
我注意到简单地把“静态”放在前面导致错误消失,但我希望这是一个实例字段。我不知道为什么会发生这种情况 - 阵列不是那么大,而且我有一台功能强大的机器。
尝试[512] [512]打破了我,但[256] [512]是完全没问题的。
我在我的智慧结尾!请帮助:)
该阵列是3  MB(在大多数实现float
)。这种大小的对象应该只能动态分配,而且对于驻留在堆栈上的MB太多了。
您有两种选择:一种是保持您的课堂是原样,并确保您只有动态分配(使用new
,拥有智能指针)。
另一个我更喜欢使用std::vector<float>
而不是3维数组,并将其作为存取函数实现索引。您甚至可以将这个向量存储在自己的类中,并将其用作您的name
数据成员的类型。
第二个选项保证3&thinsp; MB的数据将从永不驻留在非动态内存中。
这里有这样的一种可能的草图3D访问的vector
:
template <class T, size_t Dim1, Dim2, Dim3>
class Array3d
{
std::vector<T> data;
public:
Array3d() : data(Dim1 * Dim2 * Dim3) {}
T& at(size_t idx1, size_t idx2, size_t idx3)
{ return data[idx1 * Dim2 * Dim3 + idx2 * Dim3 + idx3); }
T at(size_t idx1, size_t idx2, size_t idx3) const
{ return data[idx1 * Dim2 * Dim3 + idx2 * Dim3 + idx3); }
};
一个更基本的替代方案是只动态分配数组本身:
using Array2d = std::array<std::array<float, 3>, 512>;
std::unique_ptr<Array2d[]> name{new Array2d[512]};
name[i][j][k] = 42.0f;
待办事项你知道'sizeof(float)* 512 * 512 * 3'需要多少内存,'static'是什么意思? –
大约3兆字节?我相信静态把它放在堆的一部分,它可以存储更多的数据?我不太了解! – Jon
“阵列不是那么大” - 它是3MB。虽然堆内存并不多,但它对于堆栈来说是很多**。你是否创建了这种类型的局部变量?考虑使用'std :: vector'而不是数组,或动态分配实例。 –
Angew