Как вы пишете код, совместимый как с 32, так и с 64 битами?

StackOverflow https://stackoverflow.com/questions/32533

Вопрос

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

Редактировать:О каких областях мне нужно позаботиться, напримерпечать строк / символов или использование структур?

Это было полезно?

Решение

Опции:

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

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

Другие советы

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

Или выберите интерпретируемый язык.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

-Адам Дэвис

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top