1

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

    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 也应该足够了。

另一种解决方案是使用双端队列而不是向量,但据我了解(可能是错误的),双端队列不太适合索引,我真的需要能够尽快访问任何元素。

虽然我需要更改内部向量,但我认为它们作为指针存储在 struct 中,这意味着在更改内部向量后,整个向量(这些 struct 元素的)不需要重新分配内存(也许我再次我错了)。

我在 Windows 上使用 Code::Blocks。

有谁知道,是什么导致了这个错误,我该如何解决它 - 我想将向量作为容器,但不要坚持 :) 谢谢

4

1 回答 1

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

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

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

于 2013-04-27T23:04:21.527 回答