Составляют ли члены данных диапазон?
Могу ли я рассматривать последовательные элементы данных одного типа как диапазон? Например:
struct X
{
int a, b, c, d, e;
};
X x = {42, 13, 97, 11, 31};
std::sort(&x.a, &x.a + 5); // kosher?
5 ответов
Нет, это неопределенное поведение. Вы лечите x.a
как первый элемент массива, который это не так. Может работать на некоторых реализациях, может совершать набеги на ваш холодильник тоже;)
Не делай этого. Компилятор может свободно добавлять отступы между элементами структуры (и в конце).
Если это действительно то, что вы хотите сделать, сделайте это массивом, вектором или подобным.
Как уже говорили другие, стандарт не дает никаких гарантий относительно того, что члены хранятся без пробелов или других вещей, которые вызывают проблемы. (И что еще хуже, он будет работать, пока вы не скомпилируете его с другим (версией) компилятора или для другой архитектуры несколько месяцев или лет спустя, и, конечно, будет непросто выяснить, что пошло не так).
Нет, это невозможно в C++. Было бы довольно сложно стандартизировать; в этом случае семантика достаточно проста, но что, если структура была неоднородной?
Вообще это плохая идея. Если вы хотите обрабатывать некоторые переменные как массив, вы должны объявить их как массив:)
Тем не менее вы можете использовать некоторые специфичные для компилятора инструкции, чтобы гарантировать отсутствие заполнения между элементами, например:
#pragma pack(push, 1)
struct X
{
int a, b, c, d, e;
};
#pragma pack(pop)
или же
struct __attribute__((__packed__)) X
{
int a, b, c, d, e;
};