Определить архитектуру системы (x86 / x64) во время работы - PullRequest
2 голосов
/ 28 октября 2009

Можно ли определить архитектуру системы / процессора, когда программа работает (под windows и под linux) на c ++?

Ответы [ 3 ]

4 голосов
/ 28 октября 2009

В Windows вы можете использовать __cpuid. В Linux вы можете open("/proc/cpuinfo") и просмотреть его.

Вот пример для Windows, основанный на примере на странице MSDN :

#include <intrin.h>

bool cpuSupports64()
{
    int CPUInfo[4];
    __cpuid(CPUInfo, 0);
    return (CPUInfo[3] & 0x20000000) || false;
}
1 голос
/ 28 октября 2009

В Linux вы можете использовать системный вызов uname. Он заполняет эту пользовательскую структуру:

  struct utsname {
           char sysname[];    /* Operating system name (e.g., "Linux") */
           char nodename[];   /* Name within "some implementation-defined
                                 network" */
           char release[];    /* OS release (e.g., "2.6.28") */
           char version[];    /* OS version */
           char machine[];    /* Hardware identifier */
       #ifdef _GNU_SOURCE
           char domainname[]; /* NIS or YP domain name */
       #endif
       };

Поле machine будет идентифицировать архитектуру.

0 голосов
/ 28 октября 2009

В зависимости от того, что вы намерены делать с этой информацией (например, выбрать самый быстрый код ассемблера с ручным кодом для конкретного процессора), в Linux вы можете захотеть прочитать / proc / cpuinfo, а именно: раздел «flags», чтобы выберите между реализацией SSE / SSE2, реализацией MMX и прочим.

Система с прямым порядком байтов и системой с прямым порядком байтов немного сложнее, см .: http://en.wikipedia.org/wiki/Endianess

...