Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Error: Total size of array must not exceed 0x7fffffff bytes

I have a small C++ program that requires a large 2d array.

int distanceArray[282][9900000];

I am aware that a standard 32 bit console application would be unable to allocate this much memory to my process due to the 2GB cap on 32 bit applications. However, despite the fact that I have configured my compiler to use the native amd64 toolset, I still get the same error when I try to build my application:

Error   C2148   total size of array must not exceed 0x7fffffff bytes

I have 16GB of RAM on my system, so I know that my physical memory should not be an issue. If my calculations are correct, this should only take up around 3GB. However, I don't understand why I can't seem to get the 64 bit compiler to work correctly. I have followed the directions on Microsoft's website that outline how to use the 64 bit compiler, but no matter what I do, i receive the same error. Any help would be greatly appreciated. Thank you!

I am aware that this question has been asked before, but the existing answers have not been helpful to me. Thank you for any attempt at helping me find my problem.

like image 620
Mitchell Augustin Avatar asked Feb 11 '17 06:02

Mitchell Augustin


2 Answers

The 64-bit PECOFF executable format used on Windows doesn't support creating executables that have a load size of greater than 2GB so you can't create statically allocated objects bigger than that. You run into a similar problem if you try create such an object on the stack using an automatically allocated object.

One possible solution would be to dynamically allocate the object:

int (*distanceArray)[9900000] = (int (*)[9900000]) calloc(282, 9900000);

Or if you want it more C++'ish and don't need it to be zero initialized like a statically allocated array would be:

int (*distanceArray)[9900000] = new int[282][9900000];
like image 122
Ross Ridge Avatar answered Nov 15 '22 04:11

Ross Ridge


As suggested by MSalters, an std::vector<std::vector<int>> was definitely the way to go.

For anyone who is still having this problem, here is how I initialized it:

std::vector<std::vector<int>> distanceArray(282, std::vector<int>(9000000, -1));

9,000,000 columns are created within every row of 282 items, and each value is initialized to -1 at the start.

Thanks to everyone who commented for the help!

like image 36
Mitchell Augustin Avatar answered Nov 15 '22 04:11

Mitchell Augustin