Изящный и безопасный способ определить, составляет ли архитектура 32 бита или 64 бита

Я использовал Пружину в течение нескольких лет теперь и суммы XML, который требовался, определенно становился утомительным. Между новыми XML-схемами и поддержка аннотации в Spring 2.5 я обычно делаю эти вещи:

  1. Используя "сканирование компонента" для автозагрузки классов, которые используют @Repository, @Service или @Component. Я обычно даю каждому бобу имя и затем соединяю их проводом вместе использующий @Resource. Я нахожу, что эта инфраструктура не изменяется очень часто, таким образом, аннотации имеют смысл.

  2. Используя "aop" пространство имен для всего AOP. Это действительно работает отлично. Я все еще использую его для транзакций также, потому что помещение @Transactional повсеместно, своего рода перетаскивают. Можно создать названный pointcuts для методов на любом сервисе или репозитории и очень быстро применить совет.

  3. я использую LocalContainerEntityManagerFactoryBean наряду с HibernateJpaVendorAdapter для конфигурирования, в спящем режиме. Это позволяет, в спящем режиме, легко автообнаруживают @Entity классы на пути к классу. Затем я создаю именованный боб SessionFactory с помощью "боба фабрики" и "метода фабрики", относящегося к LCEMFB.

5
задан mtasic85 17 August 2009 в 14:17
поделиться

7 ответов

Размер указателей на самом деле не очень хорошая вещь для тестирования - в стандартном C мало что можно сделать с результатом этого теста.

Мое предложение - test ((size_t) -1) , самый большой размер объекта, который понимает C:

    if ((size_t)-1 > 0xffffffffUL)
    {
            printf("> 32 bits\n");
    }
    else
    {
            printf("<= 32 bits\n");
    }

Если он больше, чем 0xffffffffUL , то в принципе вы можете иметь объекты больше, чем 2 ** 32 - 1 байт, что кажется более значимым тестом, чем туманное «32 бита против 64 бита».

(Например, если вы знаете, что максимальное значение size_t составляет всего лишь 2 ** 32 - 1 , тогда нет смысла пытаться mmap () область размером более 1 или 2 ГБ.)

3
ответ дан 18 December 2019 в 06:12
поделиться

короткий ответ: нет

длинный ответ: это зависит от слишком большого количества комбинаций ОС / компилятора. Например, во время выполнения в Linux вы можете запросить файловую систему proc, тогда как в Windows вы можете запросить регистр.

Вы можете доказать, что компилятор, который используется для компиляции, имеет 32/64 битную цель, используя что-то вроде:

bool is_32bit() {
    return sizeof(int *) == 4;
} 

bool is_64bit() {
    return sizeof(int *) == 8;
} 

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

9
ответ дан 18 December 2019 в 06:12
поделиться

Самый распространенный способ - проверить sizeof (void *) и sizeof (int) (обратите внимание, что они не обязательно должны быть то же самое).

Еще одна возможность на процессорах x86 / x64 - проверить наличие флага lm. Если он присутствует, ЦП понимает набор инструкций AMD64.

2
ответ дан 18 December 2019 в 06:12
поделиться

Безопасный и переносимый метод, к сожалению, невозможен (потому что безопасный и переносимый допускает только правила стандарта C.)

sizeof (int) с некоторыми из наиболее распространенных компиляторы могут дать вам 4 для 32-битной платформы и 8 для 64-битной платформы, но это не гарантируется. Стандарт C говорит только о том, что int должен быть «естественным» размером для вычислений на целевом объекте, и очень многие компиляторы оставили sizeof (int) равным 4 даже в 64-битном мире на том основании, что этого «достаточно» .

sizeof (void *) лучше, потому что указатель должен иметь соответствующий размер для адресации всего адресного пространства. sizeof (void *) , вероятно, даст вам 4 или 8 в зависимости от ситуации. Технически, однако, даже это не гарантируется, поскольку sizeof дает вам количество байтов, необходимое для хранения чего-либо, а байт не обязательно должен быть 8 бит. Байт технически является наименьшей адресуемой единицей памяти, которая составляет 8 бит на большинстве платформ, к которым люди привыкли. 8-битная адресация очень распространена, но я работаю с чипами, которые имеют 16-битную адресацию и размер слова 16 бит (поэтому sizeof (int) равно 1). Итак, если ваш размер байта не 8 бит, тогда sizeof (void *) может дать вам множество значений.

С другой стороны, если вы просто пытаетесь различать x86 и x64 (32-битные и 64-битные процессоры ПК), тогда будет достаточно sizeof (void *) и переносимость между компиляторами.

2
ответ дан 18 December 2019 в 06:12
поделиться

Если вы используете GCC (как указано в тегах), вы можете протестировать в качестве теста времени компиляции

#if __SIZEOF_POINTER__ == 8

, чтобы определить, является ли это 64-битной системой. Перед использованием убедитесь, что используемая версия GCC вообще определяет __ SIZEOF_POINTER __ .

8
ответ дан 18 December 2019 в 06:12
поделиться

32-битный в банке кодов или 32- бит в банке данных. :-) Процессоры 8086 имели 16-битные данные с 20-битной кодовой памятью. Кроме того, современные машины Havard делают странные вещи с разделением кода / данных ...

Вы можете проверить инструкцию cpuid для процессоров x86. Другие семейства процессоров могут не иметь такой инструкции ... YMMV.

1
ответ дан 18 December 2019 в 06:12
поделиться
int iedx;

__asm
{

mov eax, 0x80000001;
cpuid;
mov, iedx,edx;
}

     if (iedx & (1 << 29))
       {
        return 1;
       }
     return 0;
1
ответ дан 18 December 2019 в 06:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: