Привожу адаптированный пример кода. Сразу скажу, что код не мой. Альтернативное решение найдено. Но понять причины проблемы все же хочется.
#include <iostream>
#include <cstring>
struct SFirstNStruct
{
unsigned int data;
};
struct SSecondNStruct
{
unsigned short secondField;
unsigned short unusedField;
};
struct Data
{
SFirstNStruct firstField;
unsigned short secondField;
};
struct Data2
{
SFirstNStruct firstField;
SSecondNStruct nestedStruct;
};
int main()
{
Data2 d2;
char * s2 = (char*) &(d2.nestedStruct.secondField);
char * f2 = (char*) &(d2.firstField.data);
std::cout << s2 - f2 << std::endl;
Data d;
char * s = (char*) &d.secondField;
char* f = (char*) &d.firstField.data;
std::cout << s - f << std::endl;
std::memcpy(&d2, &d, sizeof(Data));
return 0;
}
Вся суть в последнем memcpy. Когда-то это работало, потом перестало. Стал я проводить расследование и выяснил. Data2::SSecondNStruct::secondField и Data::secondField имеют разные офсеты от начала структуры. Написал вот этот тетовый пример, который выводит 4,4. А на реальной системе 8,4. Отсюуда вопрос, что могло вызвать такое поведение? Опции компилятора, прагмы? Пока ничего не в хедерах, ни в опциях компилятора криминального не нашел. gcc 5.4 вроде.