8

struct単一のメンバーを使用すると、メンバーの種類と同じパフォーマンス (メモリ使用量と速度) がありますか?

このコードはstruct、単一のメンバーを持ちます:

struct my_int
{
    int value;
};

の性能はmy_intと同じintですか?

4

4 に答える 4

6

全体的に@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);
于 2013-11-09T18:50:46.157 に答える
4

場合によっては、構造体を返して関数に渡すための特定のルールが 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

通常、このパフォーマンスの違いは無視できるはずですが、大きな違いが生じる可能性のあるケースの 1 つは、この違いによって末尾再帰が有効または無効になる場合です。

gとして実装されているとしますint g(int a, struct S b) { return g(a, b).m; }。現在、fの結果が と同じ方法で返される実装ではg、これは (clang からの実際の出力) にコンパイルされる可能性があります。

        .file "test.c"
        。文章
        .globl g
        .align 16、0x90
        .type g,@関数
g: # @g
        .cfi_startproc
# BB#0:
        jmp f #TAILCALL
.Ltmp0:
        .size g, .Ltmp0-g
        .cfi_endproc


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

ただし、他の実装では、このような末尾の呼び出しは不可能であるため、深く再帰的な関数で同じ結果を達成したい場合は、実際には同じ戻り値の型fを指定する必要があります。そうしないとg、スタック オーバーフローのリスクが生じます。(テールコールが義務付けられていないことは承知しています。)

これはが よりも速いという意味でも、が よりも速いという意味でもありませ。同じメモリが一貫して使用されている限り、メモリ使用量はまたはが使用されているかどうかにかかわらず同様です。intSSintintS

于 2014-02-08T10:37:00.863 に答える