Is there a max array length limit in C++?

后端 未结 12 1521
深忆病人
深忆病人 2020-11-22 07:21

Is there a max length for an array in C++?

Is it a C++ limit or does it depend on my machine? Is it tweakable? Does it depend on the type the array is made of?

12条回答
  •  醉话见心
    2020-11-22 07:57

    As annoyingly non-specific as all the current answers are, they're mostly right but with many caveats, not always mentioned. The gist is, you have two upper-limits, and only one of them is something actually defined, so YMMV:

    1. Compile-time limits

    Basically, what your compiler will allow. For Visual C++ 2017 on an x64 Windows 10 box, this is my max limit at compile-time before incurring the 2GB limit,

    unsigned __int64 max_ints[255999996]{0};
    

    If I did this instead,

    unsigned __int64 max_ints[255999997]{0};
    

    I'd get:

    Error C1126 automatic allocation exceeds 2G

    I'm not sure how 2G correllates to 255999996/7. I googled both numbers, and the only thing I could find that was possibly related was this *nix Q&A about a precision issue with dc. Either way, it doesn't appear to matter which type of int array you're trying to fill, just how many elements can be allocated.

    2. Run-time limits

    Your stack and heap have their own limitations. These limits are both values that change based on available system resources, as well as how "heavy" your app itself is. For example, with my current system resources, I can get this to run:

    int main()
    {
        int max_ints[257400]{ 0 };
        return 0;
    }
    

    But if I tweak it just a little bit...

    int main()
    {
        int max_ints[257500]{ 0 };
        return 0;
    }
    

    Bam! Stack overflow!

    Exception thrown at 0x00007FF7DC6B1B38 in memchk.exe: 0xC00000FD: Stack overflow (parameters: 0x0000000000000001, 0x000000AA8DE03000). Unhandled exception at 0x00007FF7DC6B1B38 in memchk.exe: 0xC00000FD: Stack overflow (parameters: 0x0000000000000001, 0x000000AA8DE03000).

    And just to detail the whole heaviness of your app point, this was good to go:

    int main()
    {
        int maxish_ints[257000]{ 0 };
        int more_ints[400]{ 0 };
        return 0;
    }  
    

    But this caused a stack overflow:

    int main()
    {
        int maxish_ints[257000]{ 0 };
        int more_ints[500]{ 0 };
        return 0;
    }  
    

提交回复
热议问题