23

9.5kにコンパイルするC++プログラムがあります。1MB以上にしたいのですが。私はそれを約18kまでパディングするために次のことをしましたが、これを1MBまでずっと行うのは難しいでしょう。

コードは到達不能ですが、コンパイラの最適化により、到達可能に見えるようにする必要があったため、ブール値が変更されました。

#include "stdafx.h"
#include <iostream>
using namespace std;

void main(int argc, char* argv[])
{
    bool a = false;
    cout << endl << "Passed parameters";
    for (int i = 0 ; i < argc ; i++)
    {
        if(i == 0)
        {
            cout << endl << "Run Path (Arg0): " << argv[i];
            a=true;
        }
        else
        {
            cout << endl << "Arg" << i << ": " << argv[i];
            if(a){a=false;}
        }
    }
    cout << endl << endl;
    system("pause");
    if (a){
    string pad1 = "padpadpadpadpadpadpadpadpadpadpadpadpadpadp1adpadpadpadpadpa";
    string pad2 = "dapdapdapdapdapdapdapdapd2apdapdapdapdapdapdapdapdapdapdapd";
    string pad3 = "dipdipdipdipdipdipdipdipdipdipd3ipdipdipdipdipdipdipdipdip";
    string pad4 = "dipdipdipdi4pdipdipdipdipdipdipdipdipdipdipdipdipdipdipdip";
    string pad5 = "dipdipdipd5ipdipdipdipdipdipdipdipdipdipdipdipdipdipdipdip";
    string pad6 = "dipdipdipd6ipdipdipdipdipdipdipdipdipdipdipdipdipdipdipdip";
    string pad7 = "dipdipdipd7i1pdipdipdipdipdipdipdipdipdipdipdipdipdipdipdip";
    string pad8 = "dipdipdip8dipdipdip1dipdipdipdipdipdipdipdipdipdipdipdipdip";
    string pad9 = "dipdipdipd9ipdipdipdipdip1dipdipdipdipdipdipdipdipdipdipdip";
    string pad10= "padpadpadpadpadpadpadpadpadpadp1adpadpadpadp1adpadpadpadpadpa";
    string pad11= "dapdapdapdapdapdapdapdapd2apdapdapdapdapdap1dapdapdapdapdapd";
    string pad12= "dipdipdipdipdipdipdipdipdipdipd3ipdipdipdipdipdipdip1dipdip";
    string pad13= "dipdipdipdi4pdipdipdipdipdipdipdipdipdipdipdipdipdi1pdipdip";
    string pad14= "dipdipdipd5ipdipdipdipdipdipdipdipdipd2ipdipdi1pdipdipdipdip";
    string pad15= "dipdipdipd6ipdipdipdip2dipdipdipdipdipdipdip1dipdipdipdipdip";
    string pad16= "dipdipdipd7ipdipdipdip2dipdipdipdipdip1dipdipdipdipdipdipdip";
    string pad17= "dipdipdip8dipdipdipdipdipdipd2ipdip1dipdipdipdipdipdipdipdip";
    string pad18= "dipdipdipd9ipdipdipdip1dipdipdipdipdipdi2pdipdipdipdipdipdip";
    string pad19= "padpadpadpadpadpadpadpadpadpadpad2padpadpadp1adpadpadpadpadpa";
    string pad20= "dapdapdapdapdapd2apdapdapd2apdapdapdapdapdapdapdapdapdapdapd";
    string pad21= "dipdipdipdipdipd2ipdipdi2pdipdipd3ipdipdipdipdipdipdipdipdip";
    string pad22= "dipdipdipdi4pdipdipdipd2ipdipdipdipdipdipdipdipdipdipdipdip";
    string pad23= "dipdipdipd5ipdip2dipdipdipdipdipdipdipdipdipdipdipdipdipdip";
    string pad24= "dipdipdipd6ipdipdipdi2pdipdipdipdipdipdipdipdipdipdipdipdip";
    string pad25= "dipdipdipd7i1pdipdipdipdipdipdip2dipdipdipdipdipdipdipdipdip";
    string pad26= "dipdipdip8dipdipdip1dipdipdip1dipdipdipdipdipdipdipdipdipdip";
    string pad27= "dipdipdipd9ipdipdipd1ipdip1dipdipdipdipdipdipdipdipdipdipdip";
    string pad28= "padpadpadpadpadpadpadpadp1adpadp1adpadpadpadp1adpadpadpadpadpa";
    string pad29= "dapdapdapdapdapdapdapdapd2apdapdapdapdapda1p1dapdapdapdapdapd";
    string pad30= "dipdipdipdipdipdipdipdipdipdipd3ipdipd1ipdipdipdipdip1dipdip";
    string pad31= "dipdipdipdi4pdipdipdipdipdipdipdi1pdipdipdipdipdipdi1pdipdip";
    string pad32= "dipdipdipd5ipdipdipdi1pdipdipdipdipdipdipdipdi1pdipdipdipdip";
    string pad33= "dipdipdipd6ipdipdipdip1dipdipdipdipdipdipdip1dipdipdipdipdip";
    string pad34= "dipdipdipd7ipdipdipdipdip1dipdipdipdip1dipdipdipdipdipdipdip";
    string pad35= "dipdipdip8dipdipdipdipdipdipdi1pdip1dipdipdipdipdipdipdipdip";
    string pad36= "dipdipdipd9ipdipdipdip1dipdipdipd1ipdipdipdipdipdipdipdipdip";}
    return;
}
4

6 に答える 6

14

これを試して:

char waste[1024*1024] = {1};

少なくとも私のTDM-GCC(Win7)では、出力は1MB大きくなります。あなたが書くなら

char waste[1024*1024] = {0};

最適化されます(結果として27kBになります)。

于 2012-04-18T17:26:09.730 に答える
8

静的実行可能ファイル(の-staticフラグgcc)を使用してコンパイルし、1MBを超えるまでシステムインクルードを追加します。Windowsでも同じことができると思いますが、私はWindowsでプログラミングしていないので、間違っている可能性があります。ただし、その方法を説明しているように見えるリンクは次のとおりです。http: //www.geekadmin.com/?p=34

于 2012-04-18T17:32:07.173 に答える
4

簡単な解決策があります。.exeファイルにデータファイルを追加するだけです。Windowsは発行元が不明であると文句を言いますが、確認後問題なくプログラムを実行します。

于 2012-04-18T17:28:05.360 に答える
2

たぶん、1MBのサイズのファイルを作成し、すべての情報を変数またはデータ構造に読み込むことができます。

それか、データ構造を作成してループで、そこに大量のジャンクを書き込むことができます。これにより、プログラムが大幅に遅くなる可能性があることに注意してください。

于 2012-04-18T17:21:32.297 に答える
2
int main(){}
char lol[1024*1024] = { 1 };

lol[1024*1024];charだけでは不十分であることに注意してください。そうでない場合、コンパイラはOSにゼロで埋められた領域を作成するように指示するだけです。このようにして、1MBの無意味なヒープがプログラムに埋め込まれます。

于 2012-04-18T17:25:33.190 に答える
1

コンパイル時にメモリを静的に割り当てることにより、実行可能ファイルのフットプリントを大きくすることができます。たとえば、次を追加するだけです。

static char padding[1024 * 1024] = {1};

これにより、ストレージが実行時に割り当てられるのではなく、静的に割り当てられます。これは、アレイの最初のメモリスロットの初期化値を省略した場合に発生します。つまり、ゼロ以外の値への明示的なコンパイル時の初期化がない場合、配列は.bssオブジェクトファイルのセクションに格納されるため、リンカは、メモリを割り当てる必要があることをOSランタイムに示すタブのみを格納します。.dataオブジェクトファイルのセクションにメモリを静的に割り当てるのではなく、実行時に配列を割り当てます。これにより、実行可能ファイル自体に配列のメモリフットプリントが作成されます。

于 2012-04-18T17:30:11.777 に答える