数据量越大,内存错误分配错误

时间:2013-04-27 22:37:57

标签: c++ vector size allocation

我有一个包含结构元素的向量:

    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。

有没有人有一个想法,是什么导致这个错误,我怎么能解决它 - 我想保持矢量作为一个容器,但不要坚持:) 感谢

1 个答案:

答案 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字节的对象不应该是可用内存中的任何问题。但是,如果每个对象都附加了额外的数据,那么它显然会加起来。

我完全同意你的结构应该适合内存,所以我很确定它是占用大量空间的其他东西(例如邻居和方向元素)。

是的,在有人在评论中提到这一点之前,这不是一个正确的答案。因为问题中没有足够的信息可以给出正确答案......我只是想写一些讨论这个问题的内容,而且它并不适合评论......