17

私は C++ でコーディングしていることを考慮して、可能であれば、組み込み関数のようなソリューションを使用して、ハードウェアに関する有用な情報を読みたいと思います。私の懸念/考慮事項は次のとおりです。

  • 私はアセンブリをよく知りません。この種の情報を取得するだけでもかなりの投資になります (CPU のように見えますが、値を反転してレジスタを読み取るだけです。)
  • asm には少なくとも 2 つの一般的な構文 ( Intel と AT&T ) があるため、断片化されています。
  • 奇妙なことに、組み込み関数は、最近では asm コードよりも人気があり、サポートされています
  • 現在、私のレーダーにあるすべてのコンパイラがインライン asm をサポートしているわけではありません。MSVC 64 ビットはその 1 つです。私が使用しなければならないさまざまなコンパイラの機能セットをさらに掘り下げているうちに、他の同様の欠陥が見つかるのではないかと心配しています。
  • 組み込み関数に賭ける方が生産的であると私が考えるトランズを考えると、それはどの asm コードよりもはるかに簡単なはずです。

そして、私が答えなければならない最後の質問は、組み込み関数で同様のことを行うにはどうすればよいかということです。この種の情報を取得するための CPUID オペコード以外に何も見つからなかったからです。

4

5 に答える 5

12

掘り下げた後、gcc 固有の便利な組み込み関数を見つけました。

唯一の問題は、この種の関数が実際に制限されていることです (基本的に、CPU の「名前」用に 1 つ、レジスタ セット用に 1 つの 2 つの関数しかありません)。

例は

#include <stdio.h>

int main()
{
    if (__builtin_cpu_supports("mmx")) {
        printf("\nI got MMX !\n");
    } else
        printf("\nWhat ? MMX ? What is that ?\n");
    return (0);
}

どうやらこの組み込み関数は mingw-w64 でも動作するようです。

于 2013-07-20T05:43:12.063 に答える
7

このような組み込み関数も、通常はコンパイラ固有です。

MS VC++ には、CPUID op コードを生成する__cpuid(および) があります。__cpuidex

少なくとも私の知る限り、gcc/g++ はそれに相当するものを提供していません。インライン アセンブリが利用可能な唯一のオプションのようです

于 2013-07-20T04:34:04.707 に答える