О перечислениях в Delphi и C ++ в 64-битных средах - PullRequest
0 голосов
/ 08 апреля 2010

Мне недавно пришлось работать с различными размерами по умолчанию, используемыми для перечислений в Delphi и c ++, так как я должен использовать dll c ++ из приложения delphi.

Один вызов функции возвращает массив структур (или записей)в delphi), первым элементом которого является enum.

Для этой работы я использую упакованные записи (или выровненные (1) -структуры).Однако, поскольку delphi по умолчанию выбирает размер переменной enum динамически и использует наименьший возможный тип данных (в моем случае это был байт), но C ++ использует int для перечислений, мои данные не были правильно интерпретированы.

Delphi предлагает переключение компилятора, чтобы обойти это, поэтому объявление enum становится

    {$Z4} 
    TTypeofLight = 
    (
        V3d_AMBIENT,
        V3d_DIRECTIONAL,
        V3d_POSITIONAL,
        V3d_SPOT
   );
   {$Z1}

Мои вопросы:

  • Что будет с моими структурами, когда онискомпилированы в / для 64-битной среды?
  • Увеличивается ли целое число c ++ по умолчанию до 8 байт?
  • Существуют ли другие модификации выравнивания памяти / размера данных (кроме указателей)?

Ответы [ 2 ]

3 голосов
/ 08 апреля 2010

Когда Delphi поддерживает 64-битную компиляцию, размер целого числа останется 4 байта с указателями, увеличивающимися до 8. FreePascal имеет типы PtrInt и PtrUInt, которые являются «достаточно большими целыми числами, чтобы содержать указатели», а Delphi будет предположительно добавить что-то похожее.

Поскольку вы явно объявляете размеры перечисления, они останутся 4 байтами, даже если вы находитесь на платформе, где увеличился целочисленный размер, поскольку обычно они бывают только 1 байтом. При размещении неупакованных структур данных будет применяться существующее правило: поля будут выровнены по размеру типа, поэтому целые числа будут выровнены по 4 байта, а Int64 и указатели будут выровнены по 8 байтов.

В Википедии есть таблица , показывающая размеры типов данных для различных 64-разрядных ОС, но слишком рано экстраполировать, как Embarcadero будет обрабатывать другие 64-разрядные платформы (Linux и OS X).

2 голосов
/ 08 апреля 2010

Для Delphi нет 64-битного компилятора, поэтому вы не можете скомпилировать вашу программу для 64-битной версии. Тем не менее, вы все равно можете скомпилировать его и запустить на 64-битной ОС как 32-битный процесс. в этом случае с вашими структурами будет происходить замечание.

Вопрос о библиотеке немного сложнее: если вы скомпилируете ее как 64-битную библиотеку, вы вообще не сможете загрузить ее в 32-битный процесс. Однако если предположить, что вы собираетесь скомпилировать его для 64-битного кода, а затем использовать его из 64-битного процесса, тогда фактическая длина переменной int, скорее всего, останется 32-битной (это не будет так для всех хотя).

См. Эту статью в Википедии для получения дополнительной информации:

http://en.wikipedia.org/wiki/64-bit#Specific_data_models

...