Как вы пишете код, совместимый как с 32-битной, так и с 64-битной версией? - PullRequest
0 голосов
/ 28 августа 2008

Какие соображения мне нужно учитывать, если я хочу, чтобы мой код работал правильно на 32-битной и 64-битной платформах?

РЕДАКТИРОВАТЬ: В каких областях мне нужно ухаживать, например, печать строк / символов или использование структур?

Ответы [ 9 ]

2 голосов
/ 28 августа 2008

Параметры:

Кодируйте его на каком-либо языке с Виртуальной машиной (например, Java)

Кодируйте его в .NET и не ориентируйтесь на какую-либо конкретную архитектуру. .NET JIT-компилятор скомпилирует его для правильной архитектуры перед запуском.

1 голос
/ 28 августа 2008

То же самое, что вы должны были делать все время, чтобы гарантировать, что вы пишете переносимый код:)

рекомендации Mozilla и C faq являются хорошими отправными точками

1 голос
/ 28 августа 2008

Одним из решений было бы нацеливание на виртуальную среду, которая работает на обеих платформах (я думаю, Java или .Net здесь).

Или выберите устный перевод.

Есть ли у вас другие требования, такие как вызов существующего кода или библиотек?

0 голосов
/ 28 августа 2008

Имейте в виду, что многие компиляторы выбирают размер целого числа на основе базовой архитектуры, учитывая, что "int" должен быть самым быстрым манипулятором числа в системе (согласно некоторым теориям).

Вот почему так много программистов используют typedefs для своих наиболее переносимых программ - если вы хотите, чтобы ваш код работал на всем, от 8-битных процессоров до 64-битных процессоров, вы должны признать, что в C в любом случае int не определен жестко .

Указатели - это еще одна область, к которой следует быть осторожным - не используйте long, long или long long или какой-либо конкретный тип, если вы работаете с числовым значением указателя - используйте правильную конструкцию, которая, к сожалению, отличается от компилятора компилятору (именно поэтому у вас есть отдельный файл typedef.h для каждого используемого компилятора).

-Адам Дэвис

0 голосов
/ 28 августа 2008

В большинстве случаев вам остается только скомпилировать код для обеих платформ. (И это при условии, что вы используете скомпилированный язык; если это не так, то вам, вероятно, не нужно ни о чем беспокоиться.)

Единственное, о чем я могу думать, это может вызвать проблемы, это предположить размер типов данных, что вам, вероятно, не следует делать в любом случае. И, конечно же, все, что написано на ассемблере, может вызвать проблемы.

0 голосов
/ 28 августа 2008

В C (и, возможно, C ++) всегда не забывайте использовать оператор sizeof при расчете размеров буфера для malloc. Таким образом, вы все равно будете писать более переносимый код, и это автоматически примет во внимание 64-битные типы данных.

0 голосов
/ 28 августа 2008

Это, честно говоря, зависит от языка, потому что управляемые языки, такие как C # и Java или языки сценариев, такие как JavaScript, Python или PHP, привязаны к своей текущей методологии, и для начала и для выполнения чего-либо, кроме продвинутых вещей, не так много беспокоиться о.

Но я предполагаю, что вы спрашиваете о таких языках, как C ++, C и других языках более низкого уровня.

Самая большая вещь, о которой вам нужно беспокоиться, это размер вещей, потому что в 32-битном мире вы ограничены силой 2 ^ 32, однако в 64-битном мире все становится больше 2 ^ 64.

В 64-разрядной системе у вас больше места для памяти и памяти в ОЗУ, и вы можете вычислять большие числа. Однако, если вы знаете, что компилируете для 32 и 64, вы должны обязательно ограничить свои ожидания от системы 32-битным миром и ограничениями буферов и чисел.

0 голосов
/ 28 августа 2008

Самое главное, чтобы вы не помещали указатели в 32-разрядные хранилища.

Но на этот вопрос нет правильного «независимого от языка» ответа. Вы даже не могли бы получить особенно твердый ответ, если бы ограничивали себя чем-то вроде стандартного «C» или «C ++» - размер хранилища данных, указателей и т. Д., Все это ужасно зависит от реализации.

0 голосов
/ 28 августа 2008

Полагаю, вы все еще говорите о компиляции их отдельно для каждой отдельной платформы? Поскольку запуск их на обоих полностью выполним, просто создав 32-битный двоичный файл.

...