Составляют ли члены данных диапазон?

Могу ли я рассматривать последовательные элементы данных одного типа как диапазон? Например:

struct X
{
int a, b, c, d, e;
};

X x = {42, 13, 97, 11, 31};

std::sort(&x.a, &x.a + 5);   // kosher?

16

Решение

Нет, это неопределенное поведение. Вы лечите x.a как первый элемент массива, который это не так. Может работать на некоторых реализациях, может совершить набег на ваш холодильник тоже;)

15

Другие решения

Не делай этого. Компилятор может свободно добавлять отступы между элементами структуры (и в конце).

7

Если это действительно то, что вы хотите сделать, сделайте это массивом, вектором или подобным.

Как уже говорили другие, стандарт не дает никаких гарантий относительно того, что члены хранятся без пробелов или других вещей, которые вызывают проблемы. (И что еще хуже, он будет работать, пока вы не скомпилируете его с другим (версией) компилятора или для другой архитектуры через несколько месяцев или лет, и, конечно, будет непросто выяснить, что пошло не так).

4

Нет, это невозможно в C ++. Было бы довольно сложно стандартизировать; в этом случае семантика достаточно проста, но что, если структура была неоднородной?

2

Вообще это плохая идея. Если вы хотите обрабатывать некоторые переменные как массив, вы должны объявить их как массив 🙂

Тем не менее, вы можете использовать некоторые компилятор конкретных инструкция, обеспечивающая отсутствие заполнения между элементами, например:

#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;
};
0
По вопросам рекламы [email protected]