На каких архитектурах вычисление неверных указателей небезопасно?

int* a = new int[5] - 1;

Эта строка сама по себе вызывает неопределенное поведение в соответствии со стандартом C ++, потому что a - недопустимый указатель, а не один за концом. В то же время это способ создания массива на основе 1 с нулевыми накладными расходами (первый элемент - это [1]), который мне нужен для моего проекта .

Мне интересно, это это то, чего мне нужно избегать, или если стандарт C ++ просто консервативен для поддержки некоторых причудливых архитектур, на которых мой код никогда не будет работать. Итак, вопрос в том, на каких архитектурах это будет проблемой? Распространены ли какие-либо из них?

Редактировать: Чтобы увидеть, что строка выше действительно вызывает неопределенное поведение, взгляните на этот вопрос .

Редактировать: Деннис Зикефуз указывает, что компиляторам разрешено делать что-либо при вызове неопределенного поведения, поэтому и компилятор, и ЦП должны предлагать гарантии, выходящие за рамки стандарта C ++, для работы такого кода. Я расширяю вопрос о том, есть ли эта проблема у современных компиляторов C ++.

9
задан Community 23 May 2017 в 12:19
поделиться