Как да определите битността на приложението

Понастоящем, във връзка с разпространението на 64-битови процесори и операционни системи, разработчиците на софтуер често се сблъскват с въпроса за софтуерното определяне на неговата битовост.

Това може да бъде причинено както от декоративни причини („автоматично“, показващо битовата дълбочина на потребителя, например „Моята програма 1.0 64-битова версия“), така и от необходимостта да се използват различни алгоритми в различни архитектури, за да се възползват максимално от техните характеристики и в същото време поддържат една единствена кодова база.

Най-простите начини

В Delphi, за да се определи битността на приложението, е достатъчно да се получи размерът на нетипизиран указател, използвайки стандартната техника.

В резултат на това ще бъде върнат размерът на нетипизирания указател в байтове. За да конвертирате в битове, е достатъчно да умножите резултата по 8. В случай на 32-битово приложение резултатът ще бъде 4 (след умножаване на 32). В случай на 64-битово приложение резултатът ще бъде 8 (след умножаване на 64).

Има подобен трик за C ++.

Има подобен начин в езика C #. За да определите дълбочината на битовете, трябва да знаете размера на типа IntPtr. Този тип обаче няма предварително зададен размер и следователно директното използване на функцията sizeof ще доведе до синтаксична грешка.

В резултат на това трябва да използвате метода SizeOf на класа Marshal от пространството от имена System.Runtime.InteropServices (това пространство от имена първо трябва да бъде активирано с помощта на директивата using). В резултат на това изпълнението за C # изглежда така:

Разбира се, това е малко по-тромаво от Delphi или C++.

Всички тези методи са изключително прости и достъпни дори за начинаещи. Всички те обаче имат един общ недостатък. Когато се използва в програма, двете версии на кода се компилират едновременно (както за 32-битово, така и за 64-битово приложение). В случай на малки проекти или незначителни разлики в алгоритмите между версиите, това може да не е критично. В противен случай значителен размер на програмата ще представлява неизползван код. Това ще доведе до ненужно увеличаване на размера на изпълнимия файл на програмата или файла на библиотеката в случай на DLL. Поради тази причина всички горепосочени методи за внедряване на специален код за конкретна архитектура като цяло не са подходящи.

Условна компилация

За щастие има алтернатива за това под формата на директиви за условно компилиране.

Delphi има стандартен символ за условно компилиране WIN32, който обозначава 32-битовата версия на операционната система Windows. Използвайки този символ и директивата за компилатор $ IFDEF, можете да посочите кой код ще се компилира в случай на 32-битово приложение и кой в ​​случай на 64-битово.

За по-голяма яснота, нека дадем най-простия пример: