我有一个包含结构元素的向量:
struct hairParticle{
bool seed;
double mass;
double diameter;
double stiffnessCoeff;
double bendingCoeff;
double frictionCoeff;
glm::vec3 position;
glm::vec3 velocity;
glm::vec3 force;
std::vector<glm::vec3> direction;
std::vector<unsigned int> neighbours;
std::vector<double> neighbourRestingLengths;
};
当我尝试使用数据填充此向量时,它可以正常使用大约1000个条目,但是大约有3000个程序因内存分配不当而崩溃。 我不知道是什么导致这种情况。经过一些谷歌搜索我发现了这个:
http://www.cplusplus.com/forum/general/13653/
并且计算机说这个结构的大小是120字节,可能没有考虑内部向量的大小,但是现在它们的大小不超过10个元素。因此,即使每个3000个元素有200个字节,最大内存4GB也应该足够了。
另一个解决方案是使用deque而不是vector,但正如我所理解的那样(可能是错误的),deque不适合索引,我真的需要能够尽快访问任何元素。
虽然我需要更改内部向量,但我认为它们作为指针存储在struct中,这意味着在内部向量发生更改后,整个向量(这些struct元素)不需要重新分配内存(再次也许我错了。)
我在Windows上使用Code :: Blocks。
有没有人有一个想法,是什么导致这个错误,我怎么能解决它 - 我想保持矢量作为一个容器,但不要坚持:) 感谢
答案 0 :(得分:2)
struct hairParticle{
bool seed; // 8 bytes
double mass;
double diameter;
double stiffnessCoeff;
double bendingCoeff;
double frictionCoeff; // 5 * 8 = 40 bytes
glm::vec3 position; // 12 bytes?
glm::vec3 velocity; // 12 bytes?
glm::vec3 force; // 12 bytes?
std::vector<glm::vec3> direction; // About 12 or 24 bytes?
std::vector<unsigned int> neighbours; // about 12 or 24 bytes
std::vector<double> neighbourRestingLengths;// about 12 or 24 bytes
};
在32位机器上,结构本身大约需要120个字节,是的。
但是你也可能会把东西存放在结构底部的向量中,这会占用额外的内存。
我还应该指出,如果您使用的是Windows,32位模式下应用程序的内存限制为2GB(除非您已经跳过了箍)。启用“大地址感知”的32位应用程序可以在32位版本的Windows上将其扩展到3GB,或者在64位版本的Windows中将其扩展到4GB以下。在Linux中,限制大约为3GB。
但即便如此,你应该能够容纳超过3000个大小在120到200字节之间的对象。实际上,超过一百万个200字节的对象不应该是可用内存中的任何问题。但是,如果每个对象都附加了额外的数据,那么它显然会加起来。
我完全同意你的结构应该适合内存,所以我很确定它是占用大量空间的其他东西(例如邻居和方向元素)。
是的,在有人在评论中提到这一点之前,这不是一个正确的答案。因为问题中没有足够的信息可以给出正确答案......我只是想写一些讨论这个问题的内容,而且它并不适合评论......