2011-01-17 7 views
3

理由私は聞いてるのよ:exeは、最大の宣言されたバッファよりも小さくすることはできますか?

#include <string.h> 

using namespace std; 

int main() 
{ 
    unsigned char file[512000]; 
    unsigned char key[512000]; 
    for(int i = 0; i < 512000; i++) 
      file[i] = key[i]; 
    return 0; 
} 

私はWindows上でcl.exeのでこれをコンパイルすると、私は、サイズが31キロバイト程度である実行可能ファイルを取得します。バッファー自体はそれぞれ500kbです。これはどういう意味ですか?その一部はヒープに割り当てられますか?データで初期化した場合、サイズは正しいでしょうか?

+0

31 KBはこのプログラムのために非常に多くのようです。 ;-) –

+3

64KBは誰にでも十分なはずです... – Brad

+0

見て、ma!私は役に立たないコメントを作り出すことができます。 –

答えて

12

この場合、バッファは実行時にプログラムのstack spaceに割り当てられます。 exeファイルに静的に組み込む必要はありません。

+1

私はすべてのスタック割り当てが実行時にのみ起こるべきだと思います(私は定数について話しません)。 – Elalfer

+4

@Elalfer、確かに - スタックは実行時にのみ存在するからです。 –

5

変数(むしろそのブロック)を宣言しており、アプリケーションに保存する必要があるデータを定義していないことに注意してください。ハードドライブに保存しているのは、バッファそのものではなく、命令の一連のものです。

1

これらの配列は、すべての自動変数と同様に、スタックに割り当てられます。サイズを表すためにバイナリに長い文字列を入れるのは無意味です。あなたのコードで配列の内容全体を定義するならば、バイナリサイズは配列サイズとコンパイルされたコードのサイズの和に近くなります。

0

実行時に配列が割り当てられ、初期化され、使用されます。。それらは、.exeまたは任意のファイル(仮想メモリまたはスワップファイルを保存)に保存されません。

+0

実際、thayは 'auto'変数なので、初期化されていないため、割り当てられません。彼らが「静的」と宣言されていれば、それは当てはまります。 – Clifford

+0

ああ申し訳ありません。私はちょうど実際のスニペットを超えたより一般的な例を与えていた(私はそれを完全に読まなかった)。 – orlp

0

実行可能バイナリに組み込むには、ゼロ以外の初期化データのみが必要です。これらはユニット化された配列です。

関連する問題