2017-07-03 9 views
1

いくつかの基本構造体にキャストするのではなく、void *とのキャストのパフォーマンスに違いはありますか?これは、部分的に半動的型入力システムを達成することにある。ここでvoid *へのキャストと基本構造体ポインタとの間にパフォーマンスの違いはありますか?

が私のコードです:

#include "stdlib.h" 

typedef struct 
{ 
    unsigned char type; 
} Dyn; 

typedef struct 
{ 
    unsigned char type; 
    int number; 
} Num; 

typedef struct 
{ 
    unsigned char type; 
    char letter; 
} Lett; 

int main(void) { 
    Num* n = (Num *)malloc(sizeof(Num)); 

    void* hold = n; // to void * casting 
    Num* n_g = (Num *)hold; 

    Dyn* dhold = (Dyn *)n; // to base struct casting 
    Num* n_d = (Num *)dhold; 
    return 0; 
} 

ので、構造体へのポインタの観点から、void *または基本型の構造体を使用しての間で任意のパフォーマンスの違いはありますか?

+0

パフォーマンスの考慮事項をお勧めします、プラットフォームおよび設定を変更するには、詳細を含める必要があります。そして、おそらくあなたは異なるメソッド間で生成されたアセンブリを比較することによってあなたの質問に答えることができました –

+0

ああ、これはgccのだろうが、私はあなたの言うことを参照してください。 –

+0

私はM.Mに同意します。キャストに関するパフォーマンスについては、オペレーティングシステムと素材を提供する必要があります。ほとんどの場合、この操作は無料です。ところで、この種の機能をビルドするために 'void * 'を使うのは、C言語のパターンではありません。 – Stargateur

答えて

3

いくつかの基本構造体にキャストするのではなく、void *とのキャストのパフォーマンスに違いがありますか?

のはそれを想定してみましょう:

  • ターゲットプラットフォームは、x86、x86-64で、ARM、AARCH、PowerPCの(32または64ビット)のようないくつかの一般的なプロセッサあなたが

  • ですあなたには、いくつかの最適化を有効にしている

  • 良い最適化コンパイラ(のようなGCCまたはClang/LLVM)を使用して(あなたが-O1でコンパイルしますまたは少なくとも-O2

その後のポインタは、内部アドレスとして表され、そしてあなたは、パフォーマンスの違いがあってはなりません。生成されたアセンブラコード(gcc -O1 -S -fverbose-asm ....)を確認してください。

ただし、union(ポインタはunionのポインタはstruct)を使用することもできます。

ところで、私は(Queinnecによって例えばLisp In Small Pieces)いくつかの既存のfree software通訳(例えばguileluasiod)のソースコードを勉強し、それらについての良い本を読んで、必ずしも特定のコンパイラにappertain

+0

そうですね、プリミティブ型や小さな型にはおそらくユニオンを使用します –

関連する問題