Мне уже приходилось иметь дело с такими разными размерами одного и того же класса.
В лучшем случае это приводит к сбоям (поскольку ваш код будет пытаться читать / писать за пределами фактических данных класса), а в худшем - к странным ошибкам (например, установка значения переменной-члена равной 42 и при чтении это чтобы увидеть значение вместо 1376256 или что-то в этом роде.
Причина обычно была связана с проблемами выравнивания.
вот что вы можете сделать, чтобы убедиться, что ваша проблема связана с выравниванием:
Прямо перед (или после) определения класса добавьте следующую строку:
#pragma pack(show)
В выводе компиляции вы должны увидеть что-то вроде:
1>. \ Test_align.cpp (59): предупреждение C4810: значение пакета прагмы (показать) == 8
Это покажет выравнивание, когда ваш заголовок скомпилирован. Это будет появляться каждый раз, когда заголовок включен в файл CPP. Это значение должно всегда быть одинаковым как при компиляции DLL, так и при компиляции EXE.
Если они отличаются, хотя бы один раз, тогда у вас проблема с неправильным выравниванием ...
Выравнивание структуры по умолчанию для проекта?
Возможно, ваша DLL имеет выравнивание структуры по умолчанию, равное 1, в то время как у EXE есть другое значение.
Пожалуйста, проверьте оба свойства проекта:
Раздел "C / C ++", подраздел "Генерация кода", свойство "Выравнивание элементов структуры".
Чтобы все работало правильно, оба проекта должны иметь одинаковые значения.
Если EXE и DLL имеют разные значения, вы должны исправить это (обычно значение «по умолчанию» является хорошим: выберите «наследовать от родительского или проектного значения»).
Pragma pack?
Есть еще один способ нарушить выравнивание, то есть с помощью операторов #pragma pack
. Например:
#pragma pack(show) // this will show the default value, i.e. 8 on my project
struct Data8 // the sizeof this struct is 8 bytes
{
bool m_bValue ;
int m_iValue ;
} ;
#pragma pack(push, 1)
#pragma pack(show) // this will show the now current value, i.e. 1
struct Data1 // the sizeof this struct is 5 bytes, thanks to the packing
{
bool m_bValue ;
int m_iValue ;
} ;
#pragma pack(pop)
#pragma pack(show) // this will show again the default value, i.e. 8
Итак, найдите операторы #pragma pack
и убедитесь, что они всегда правильно установлены и не установлены (если вы нажимаете без всплывающих окон, то, вероятно, у вас есть ошибка).
Класс имеет одинаковое выравнивание в обоих проектах?
Если вы не нашли проблему в своем классе, возможно, проблема в одном из классов / структур, от которых она наследуется или имеет переменную-член.
Так что проверяйте их так же, как вы проверяли основной класс.