2013-04-27 35 views
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程序崩溃,内存分配不当。 我不知道是什么导致this.After一些谷歌上搜索,我发现这个:

http://www.cplusplus.com/forum/general/13653/

和电脑说,这个结构的大小为120个字节,想必不考虑内部向量的大小,但现在它们的大小不超过10个元素。所以即使每个3000个元素有200个字节,最大内存4GB也应该足够了。

另一种解决方案是使用deque代替vector,但据我了解(也许是错误的),deque不适合索引,我真的需要能够尽可能快地访问任何元素。尽管我需要更改内部向量,但我认为它们作为指针存储在结构体中,这意味着整个向量(这些结构体元素)在内部向量更改后不需要重新分配内存(也许我错了)。

我在窗口上使用Code :: Blocks。

有没有人有一个想法,是什么原因导致这个错误,我怎么能解决这个问题 - 我想保持矢量容器,但不强求:) 感谢

+0

每个有多大在结构底部的向量? – 2013-04-27 22:51:22

+0

你为什么认为你的程序实际上可以分配4GB的内存?在Windows上,默认情况下可以获得2GB的地址空间,3个可以使用编译器标志和OS设置。 – 2013-04-27 23:07:48

+0

@Mats Peterson谢谢,我得到的这个错误实际上是,在初始化phaze期间,矢量方向的大小为1,而邻居和neighbourDirections的大小都是2.看着我的代码,我意识到我实际上可以为整个矢量,我做了,它为更多的元素工作,但肯定不超过一百万,它不能通过50000. – user2327838 2013-04-28 09:03:43

回答

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

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

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

+0

嗨,我想我已经部​​分地回答了你的问题,但还有一些额外的信息:Code :: Blocks是32位,Windows 7 64位。我很乐意提供任何其他信息。 – user2327838 2013-04-28 09:21:00

相关问题