Мне интересно, есть ли конкретный случай, когда перебирать переменные-члены одного типа с помощью указателя не удастся? Я знаю, что упаковка / заполнение членов определяется реализацией, но в тех реализациях, которые я пробовал (gcc, clang и Visual Studio), я не могу заставить его выйти из строя.
Даже в случаях, которые могут привести к сбою, например, в следующих случаях все это успешно выполняется:
#pragma pack(16)
struct MyStruct
{
char firstChar;
char mySecondChar;
char thirdChar;
};
class MyContainerStruct
{
public:
uint64_t big;
MyStruct z1;
MyStruct z2;
} gStruct;
main()
{
MyStruct *pStruct = &(gStruct.z1); // Start with gStruct.z1
pStruct++; // Iterate to gStruct.z2
cout << pStruct->myThirdChar;
}
Может ли кто-нибудь найти случай, когда перебор членов класса одного типа не удался?
Компилятор может изменить порядок полей, если они имеют различную видимость. Он также может заполнять поля любым количеством пространства, которое ему нравится, по любой произвольной причине (многие компиляторы имеют расширения, которые можно использовать для управления этим поведением).
Поля в пределах одного спецификатора видимости гарантированно будут в том порядке, в котором они появляются в определении. Разделы видимости не обязательно должны быть в любом порядке, даже если они имеют ту же видимость, что и другой раздел.
class A
{
public:
int someField; // will always be in the same order WRT someOtherField
int someOtherField;
private:
int anotherField; // may be before or after someField
int moreFields;
};
Других решений пока нет …