Размер структуры, содержащий вектор‹T› разных размеров между DLL и EXE

У меня есть такая ситуация, когда программа EXE импортирует DLL для одного вызова функции. Он работает, передавая пользовательскую структуру и возвращая другую пользовательскую структуру. До сих пор это работало нормально, пока я не захотел, чтобы один из элементов данных структуры был вектором ‹ MyStruct >

Когда я делаю sizeof(vector‹ MyStruct >) в своей программе, я получаю размер 20, но когда я делаю это из DLL, я получаю размер 24. Это несоответствие размера вызывает ошибку указателя ESP.

Может ли кто-нибудь сказать мне, почему размер вектора ‹ MyStruct > в DLL будет другого размера, чем в программе?

Я еще раз убедился, что мои структуры в DLL и в программе идентичны.

Буду признателен за любую помощь по теме. Спасибо.


person Michael Peddicord    schedule 19.05.2010    source источник
comment
Оба двоичных файла построены одинаково (например, отладка или выпуск)? Некоторые классы имеют дополнительное заполнение, помогающее в отладке и проверке инвариантов при сборке в режиме отладки.   -  person Chris Schmich    schedule 19.05.2010
comment
На самом деле странно то, что когда я переключаю EXE на выпуск, они становятся одинакового размера в байтах. Я не уверен, почему версия Release будет иметь большее значение, чем версия Debug....   -  person Michael Peddicord    schedule 19.05.2010


Ответы (1)


Я встречаю аналогичную проблему, когда класс имеет член vector‹..> и встроенную функцию построения (реализованную в заголовочном файле). Независимо от версии DLL или версии dll, поскольку EXE является версией выпуска, размер этого класса, вычисленный в EXE, на 3 байта меньше, чем в DLL, поэтому стек будет уничтожен.

Эта проблема может быть устранена одним из следующих изменений:

  • Это произошло только с VC98 (SP6). Перейдите на VS2008, проблема исчезнет.

  • Переместите функцию встроенной конструкции в файл CPP, и проблема тоже исчезнет
    .

Я надеюсь, что кто-то может помочь дать более подробное объяснение.

person Chime    schedule 02.09.2011