23

我有一个编译为 9.5k 的 C++ 程序。我希望它超过 1MB。我做了以下操作以将其填充到大约 18k,但是一直这样做到 1MB 会很困难。

代码无法访问,但由于编译器优化,我不得不让它看起来可以访问,因此 bool 发生了变化。

#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 上)上,输出要大 1 MB;如果你写

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

它将被优化(产生 27kB)。

于 2012-04-18T17:26:09.730 回答
8

使用静态可执行文件(-staticflag for 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
int main(){}
char lol[1024*1024] = { 1 };

请注意 charlol[1024*1024];是不够的,否则编译器只会告诉操作系统创建一个零填充区域。这样,在程序中嵌入了 1MB 无意义的堆。

于 2012-04-18T17:25:33.190 回答
2

也许您可以创建一个 1MB 大小的文件,并将所有信息读入某个变量或数据结构中。

要么,要么您可以创建一些数据结构,然后在循环中将一堆垃圾写入其中。请注意,这可能会使您的程序明显变慢。

于 2012-04-18T17:21:32.297 回答
1

您可以通过在编译时静态分配内存来增大可执行文件的占用空间。例如,只需添加:

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

这将静态分配存储,而不是导致它在运行时分配,如果您省略了数组中第一个内存插槽的初始化值,就会发生这种情况。换句话说,如果没有显式编译时初始化为非零值,则数组存储在.bss目标文件的部分中,因此链接器仅存储一个选项卡以向 OS 运行时指示它需要为其分配内存在执行时数组,而不是在.data目标文件的部分中静态分配内存,这反过来会在可执行文件本身中为数组创建内存占用。

于 2012-04-18T17:30:11.777 回答