2013-11-09 2 views
5

structは、メンバタイプ(メモリ使用率とスピード)と同じパフォーマンスを持ちますか?メンバーが1つのstructは、メンバータイプと同じパフォーマンスを持ちますか?

このコードは、単一の部材とstructある:

struct my_int 
{ 
    int value; 
}; 

int同じmy_intの性能は?

+1

パフォーマンスの仕組みは?あなたはそれをどのように使っていますか?通常のint型変数?あなたはそれをベンチマークしようとしましたか? –

+1

それを使用する方がタイピングが多いので、その意味では「あまり効果がありません」。それ以外は、コンパイラで生成されたアセンブリを見てください。 (および/またはベンチマーク) – Mat

+0

OOTBの値の型はいくつかの点で最適化されていると思いますが、違いが気付かれるとは思いません。 –

答えて

3

コンパイラが単一変数の代わりに構造体を使用することにペナルティがある場合、コンパイラとコンパイラのオプションは厳密には依存します。

しかし、構造体にメンバーが1つしか含まれていない場合、コンパイラが相違する理由はありません。メンバーにアクセスしたり、そのような構造体へのポインタをderefenceするのに必要な追加のコードが必要です。このような単純すぎる構造を持たない場合、1つのメンバーの参照は、使用されているCPUに応じて1つの追加のCPU命令を必要とする可能性があります。

5

全体@harperに同意するが、以下に注意:

古典的な差が、「非構造」配列と構造体の配列で見られます。いくつかのケースでは

char s1[1000]; 
// vs 
typedef struct { 
    char s2[1000]; 
} s_T; 
s_T s3; 

関数を呼び出す...

void f1(char s[1000]); 
void f2(s_T s); 
void f3(s_T *s); 

// Significant performance difference is not expected. 
// In both, only an address is passed. 
f1(s1); 
f1(s3.s2); 

// Significant performance difference is expected. 
// In the second case, a copy of the entire structure is passed. 
// This style of parameter passing is usually frowned upon. 
f1(s1); 
f2(s3); 

// Significant performance difference is not expected. 
// In both, only an address is passed. 
f1(s1); 
f3(&s3); 
1

、ABIは、構造体を返すと、関数に渡すための特定の規則を有することができます。例えば、

struct S { int m; }; 
struct S f(int a, struct S b); 
int g(int a, S b); 

所与f又はgを呼び出して、例えば、レジ​​スタにaを渡すこと、およびスタック上bを渡します。同様に、gを呼び出すと戻り値としてレジスタを使用することがありますが、fを呼び出すと、呼び出し元はfの結果を格納する場所を設定する必要があります。

パフォーマンスの違いは通常無視してください。大きな違いが生じるケースは、この違いが末尾再帰を有効または無効にする場合です。

gint g(int a, struct S b) { return g(a, b).m; }として実装されているとします。今、f Sの結果はgと同じ方法で返される 'が、これは(打ち鳴らすから実際の出力)にコンパイルできる実装

 
     .file "test.c" 
     .text 
     .globl g 
     .align 16, 0x90 
     .type g,@function 
g:          # @g 
     .cfi_startproc 
# BB#0: 
     jmp  f      # TAILCALL 
.Ltmp0: 
     .size g, .Ltmp0-g 
     .cfi_endproc 


     .section  ".note.GNU-stack","",@progbits 

上しかし、他の実装で、そのようなテール呼び出しが不可能です深い再帰関数に対して同じ結果を得たい場合は、実際にfgに同じ戻り値の型を与える必要があります。そうしないと、スタックのオーバーフローが発生する可能性があります。 (私は末尾再帰が義務付けされていないことを知ってる。)

このintSよりも高速で、またそれはSはしかし、intよりも高速であることを意味しているわけではありません。intまたはSのどちらが使用されても、同じものが一貫して使用されている限り、メモリの使用は似ています。

関連する問題