CPUアーキテクチャのコンパイル時の検出


82

CまたはC ++コードをコンパイルするときにCPUアーキテクチャを見つけるための最も信頼できる方法は何ですか?私の知る限り、異なるコンパイラは、(非標準のプリプロセッサの定義の独自のセットを持っている_M_X86MSVSで、__i386____arm__GCCで、など)。

構築しているアーキテクチャを検出する標準的な方法はありますか?そうでない場合は、すべてのボイラープレートを含むヘッダーなど、さまざまなコンパイラーのそのような定義の包括的なリストのソースはあり#ifdefますか?


回答:


79

事前定義されたアーキテクチャマクロおよびその他のタイプの事前定義されたマクロに関する情報を次に示します。

この質問は、それらがGCCソースコードのどこで定義さているかを尋ねます。


CまたはC ++標準は、さまざまなコンパイラで使用される示唆的なマクロを定義していますか?
クリシュナオザ2015年

これは正しいようですが、誰かがそれを使用していると言っているGCCドキュメントを引用できますか?
CiroSantilli郝海东冠事病六四事件法轮功2015

15

コンパイラ間標準はありませんが、各コンパイラは非常に一貫している傾向があります。次のようなヘッダーを自分で作成できます。

#if MSVC
#ifdef _M_X86
#define ARCH_X86
#endif
#endif

#if GCC
#ifdef __i386__
#define ARCH_X86
#endif
#endif

コンパイラは数千ありますが、広く使用されているのは3〜4つだけなので、包括的なリストにはあまり意味がありません(Microsoft C ++、GCC、Intel CC、おそらくTenDRA?)。アプリケーションがサポートするコンパイラを決定し、それらの#defineをリストし、必要に応じてヘッダーを更新するだけです。


4
これは、Visual Studio 2010では機能しません_M_X86でした。明確に定義されていません(32ビットビルド)。正しいものは_M_IX86(上記のSergeのリンクへのクレジット)です。
トーマス

6

特定のプラットフォームで利用可能なすべての機能をダンプしたい場合は、次のようにGCCを実行できます。

gcc -march=native -dM -E - </dev/null

それはのようなマクロをダンプするだろう#define __SSE3__ 1#define __AES__ 1など


-march=nativeGCC4.9以下のARMおよびMIPSでは失敗します。
jww 2016年

4

クロスコンパイラソリューションが必要な場合は、次のものを使用Boost.Predefしてください。

  • BOOST_ARCH_ コンパイル対象のシステム/ CPUアーキテクチャの場合。
  • BOOST_COMP_ 使用しているコンパイラの場合。
  • BOOST_LANG_ コンパイルしている言語標準の場合。
  • BOOST_LIB_C_ 使用中のCおよびC ++標準ライブラリの場合はBOOST_LIB_STD_。
  • BOOST_OS_ コンパイルするオペレーティングシステムの場合。
  • BOOST_PLAT_ オペレーティングシステムまたはコンパイラの上にあるプラットフォーム用。
  • BOOST_ENDIAN_ OSとアーキテクチャの組み合わせのエンディアン。
  • BOOST_HW_ ハードウェア固有の機能用。
  • BOOST_HW_SIMD SIMD(単一命令複数データ)検出用。

例えば

#if defined(BOOST_ARCH_X86)
    #if BOOST_ARCH_X86_64
        std::cout << "x86_64 " << BOOST_ARCH_X86_64 << " \n";
    #elif BOOST_ARCH_X86_32
        std::cout << "x86 " << BOOST_ARCH_X86_32 << " \n";
    #endif
#elif defined(BOOST_ARCH_ARM)
    #if _M_ARM
        std::cout << "ARM " << _M_ARM << " \n";
    #elif _M_ARM64
        std::cout << "ARM64 " << _M_ARM64 << " \n";
    #endif
#endif

使用方法について詳しくは、こちらをご覧ください。


3

標準はありません。Brian Hookは、これらの多くを彼の「ポータブルオープンソースハーネス」に記録し、それらを一貫性のある使いやすいものにしようとさえしています(それに関してはymmv)。このサイトのposh.hヘッダーを参照してください。

上記のリンクでは、少し前のDOS攻撃のために、偽のユーザーID /パスワードの入力が必要になる場合があることに注意してください。


2
うわあ-偽のリンクについて申し訳ありません-それはユーザーID /パスワードに関する情報を提供するhookatooka.com/poshlibにあるはずです。私のブラウザは、以前にページにアクセスしたときから「自動ログイン」している必要があります。
Michael Burr

2
また、注目に値する... Webサイトの作成者は、パスワードを追加した理由を次のように述べています。「ご不便をおかけして申し訳ありませんが、以前の直接リンクに対する不可解なDDoS攻撃のため、このページを作成する必要がありました。」 DDoSに対するバッファリング...」マイケルにペナルティを科すのが公正かどうかはわかりません。
jww 2016年

-2

CPU機能をきめ細かく検出する必要がある場合は、CPUでサポートされている機能のセットをstdoutまたは「cpu_config.h」ファイルに出力するCPUIDプログラムも同梱するのが最善の方法です。次に、そのプログラムをビルドプロセスと統合します。


3
クロスコンパイルでは動作しません。また、実行する必要のあるマシンがわからない限り、cpuidプログラムをどのようにコンパイルしますか?
jforberg 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.