There is no array bounds checking in a compiled language like C.
When using array bounds checking [ABC] all access of the array needs to be checked, except those that can be determined compile time (in theory). Doing ABC runtime adds code like this for every place where you access an array.
// suppose your original statement
x = array[ i * 4 ];
extents too
index = i*4;
if (index < array.minIndex || index > array.maxIndex)
{
exit("Array out of bounds error: ", array.name, index, ...);
}
else
{
x = array[index]; // for example.
}
This slows code down like sand in a gearbox (OK maybe a bit less) and causes a bigger footprint.
In Turbo Pascal and I think in Delphi too, you have directives that can be used in the code to switch on/off the ABC. I do not know such switch for C/C++ ...
Within C the choice was made to make it the responsibility of the programmer and go for performance and small footprint.
Most important argument against ABC is that ABC in fact allows bugs to exist in your code.
You do not want that, no matter which language you use, compiled or interpreted.
There are static code checkers like LINT that can do partial ABC, but still only those with fixed values.
Fortunately C++ allows you to wrap arrays in a class and add bounds checking to them, and you can even add runtime switches to use ABC or not
// such a switch is almost as expensive as the check itself, but OK it's possible.