5

これが私が実行した簡単なコードです

int a;
int main()
{
    return 0;
}

次に、gccでコンパイルした後、

size a.out

bssとdataセクションに出力があります...次にコードをこれに変更しました

int a;
int main()
{
    char *p = "hello";
    return 0;
}

コンパイル後にサイズa.outで出力を見たとき、データセクションのサイズは同じままでした。しかし、文字列helloは、読み取り専用の初期化された部分にメモリが割り当てられることがわかっています。それでは、なぜデータセクションのサイズは同じままだったのでしょうか。

4

5 に答える 5

5
#include <stdio.h>

int main()
{
return 0;
}

それは与えます

   text    data     bss     dec     hex filename
    960     248       8    1216     4c0 a.out

あなたがするとき

int a;
int main()
{
    char *p = "hello";
    return 0;
}

それは与えます

   text    data     bss     dec     hex filename
    982     248       8    1238     4d6 a.out

その時点でhelloが格納され.rodata、そのアドレスの場所がcharポインタに格納されますpが、ここではpがスタックに格納されます

サイズはスタックを示しません。よくわかりませんが、.rodata はここで text または dec で計算されます。


あなたが書くとき

int a;
char *p = "hello";
int main()
{
    return 0;
} 

それは与えます

   text    data     bss     dec     hex filename
    966     252       8    1226     4ca a.out

ここでも「hello」は .rodata に格納されますが、char ポインタは 4 バイトを取り、データに格納されるため、データは 4 ずつインクリメントされます

詳細についてはhttp://codingfreak.blogspot.in/2012/03/memory-layout-of-c-program-part-2.html

于 2012-09-27T08:15:25.843 に答える
2

実際、それは実装の詳細です。コンパイラは現状のまま動作します。つまり、プログラムの動作が同じである限り、必要なコードを自由に除外できます。この場合、char* p = "hello"完全にスキップできます。

于 2012-09-27T07:53:01.497 に答える
2

文字列「hello」はセクションに割り当てられます.rodata

于 2012-09-27T07:53:23.437 に答える
1

合計サイズが変わらなくても、コードが変わったわけではありません。

私はあなたの例をテストしました。文字列「hello」は定数データであるため、読み取り専用の .rodata セクションに格納されます。この特定のセクションは、objdump を使用して表示できます。たとえば、次のようになります。
objdump -s -j .rodata <yourbinary>

オプションなしの gcc 4.6.1 では、2 番目のコードを取得しました。

Contents of section .rodata:
 4005b8 01000200 68656c6c 6f00               ....hello.
于 2012-09-27T08:14:23.123 に答える
0

コードでそれを使用しないのでchar *、コンパイラーはそれを最適化しました。

于 2012-09-27T07:53:41.793 に答える