2010-12-17 15 views
2

サンプルプログラムとその出力を示します。スタックメモリの割り当てと配置の問題

ここ
typedef struct{ 
    char name[30]; 
    int empno; 
    int sal; 
}empd, * empdPtr; 

int main(){ 
    int x = 1; 
    char y = 2; 
    int z = 3; 
    empd e; 
    empdPtr ep = &e; 

    printf("sizeof ep = %d e = %d \n",sizeof(ep),sizeof(e)); 
    printf("Address of e = %u, ep = %u x = %u y = %u z = %u\n",&e,&ep,&x,&y,&z); 
    printf("Address of e.name = %u e.empno = %u e.sal = %u \n",&e.name,&e.empno,&e.sal); 
    return 0; 
} 

$ ./a.exe 
sizeof ep = 4 e = 40 
Address of e = 2289536, ep = 2289532 x = 2289596 y = 2289595 z = 2289588 
Address of e.name = 2289536 e.empno = 2289568 e.sal = 2289572 

& Eのアドレスとの間の差と& zは52であるが、40のバイトが十分であっても、コンパイラは12バイト以上を添加する理由はsizeof(e)は40ですか。?

答えて

3

コンパイラは、パフォーマンスの向上やコード生成の動機付けに適したメモリをレイアウトすることができます。リソースが非常に限られているOSでは、コンパイラはアクセス速度を調整するのではなく、パックすることを選択できます。おそらく、コンパイラによって生成される暗黙のローカル変数があります。これには多くの理由が考えられます。

+0

コンパイラは構造体にもパディングを追加できます。 –

+0

@Francisco確かにこのコンパイラはempd構造体がパックされていると38バイトを消費するので、これを行っています –

+0

同じことについていくつか詳細を教えてください。 – Thangaraj

関連する問題