静态数组只在内部类定义时溢出堆栈(seg fault 11),否则不会......?

时间:2017-04-14 17:56:53

标签: c++ arrays memory-management segmentation-fault

我想分配一个大的静态数组( - 想要避免动态分配,例如使用std :: vector,甚至使用' new',所以我可以保证物理地址是连续的,可以有效地预取。我的阵列大小由外部因素决定,但它们是提前知道的 - 在这个例子中,我总是需要3211264个元素。

如果我只是分配一个浮点数组,一切正常:

    #include <iostream>
    #include <cstdlib>

    using namespace std;

    float f[3211264];

    int main()
    {
      for(int i = 0; i < 3211264; i++) 
         f[i] = rand();

      for(int i = 0; i < 3211264; i++) 
         cout << f[i];
    }

但是,如果我在一个类中包装我的数组,它会导致Seg Fault:

    #include <iostream>
    #include <cstdlib>

    using namespace std;

    class T
    {
      public:
        T();

      private:
        float f[3211264];
    };


    T::T()
    {
        for(int i = 0; i < 3211264; i++)
            f[i] = rand();

        for(int i = 0; i < 3211264; i++)
            cout << f[i];

    }

    int main()
    {
        T myT;
    }

这个内存是如何分配的,当我将数据包装在一个类中时,它有什么不同的原因吗?

我希望类开销很小,任何基于对象的重新对齐或填充最多只能是页面(4K),对吗?对我来说,课程主要是为了可读性和组织性,但如果它会对性能产生重大影响,我只是抛弃它并声明一堆全局...

我的编译器信息:

配置: - prefix = / Applications / Xcode.app / Contents / Developer / usr --with-gxx-include-dir = / usr / include / c ++ / 4.2.1

Apple LLVM版本7.3.0(clang-703.0.29)

目标:x86_64-apple-darwin15.6.0

线程模型:posix

1 个答案:

答案 0 :(得分:0)

在使数组成为类成员的代码中,它不是静态分配的。如果你说:

static T myT;

虽然我无法相信静态分配会给你带来任何严重的性能提升。