c++ - 将 C++ 编译成尽可能小的尺寸

标签 c++ compilation compiler-optimization filesize

我很好奇我应该如何将一个相对简单的 C++ 脚本编译成尽可能小的可执行文件大小。

不用过多探讨为什么这个程序会有用,这是我的代码:

#include <cstdlib>
#include <stdio.h>
#include <string>

using namespace std;

unsigned long long inputAdjust(const string myinput) {
    unsigned long long myadjust;
    if (myinput=="B") {
        myadjust=1;
    } else if (myinput=="K") {
        myadjust=1024;
    } else if (myinput=="M") {
        myadjust=1048576;
    } else if (myinput=="G") {
        myadjust=1073741824;
    } else {
        myadjust=1;
    }
    return myadjust;
}

long long asmAnswer (const string myinput, const unsigned long long fir, const unsigned long long sec) {
    unsigned long long myanswer;
    if (myinput=="A") {
        myanswer = fir + sec;
    } else if (myinput=="S") {
        myanswer = fir - sec;
    } else if (myinput=="M") {
        myanswer = fir * sec;
    } else {
        myanswer = fir + sec;
    }
    return myanswer;
}

double dAnswer (const unsigned long long fir, const unsigned long long sec) {
    double myanswer;
    myanswer = (double)fir/sec;
    return myanswer;
}

void outputAnswer (const string myinput, const long long myanswer) {
    if (myinput=="B") {
        printf("%lld",myanswer);
    } else if (myinput=="K") {
        printf("%.2f",(double)(myanswer/1024));
    } else if (myinput=="M") {
        printf("%.2f",(double)(myanswer/1048576));
    } else if (myinput=="G") {
        printf("%.2f",(double)(myanswer/1073741824));
    } else if (myinput=="O") {
        if (myanswer>0) {
            if (myanswer<1024 && myanswer>-1024) {
                printf("%lld b",myanswer);
            } else if (myanswer<1048576 && myanswer>-1048576) {
                printf("%.2f kb",(double)(myanswer/1024));
            } else if (myanswer<1073741824 && myanswer>-1073741824) {
                printf("%.2f mb",(double)(myanswer/1048576));
            } else {
                printf("%.2f gb",(double)(myanswer/1073741824));
            }
        }
    } else { //assume bytes
        printf("%lld",myanswer);
    }
}

void outputAnswer (const string myinput, const double myanswer) {
    if (myinput=="P") {
        printf("%.3f",(myanswer*100.0));
    } else {
        printf("%.3f",myanswer);
    }
}

int main(int argc, char* argv[]) { 
    if (argc < 5) {
        // If we have less than 5 arguments, output the usage 
        string filename = argv[0];
        printf("\nUsage: bytemath.exe BKMG BKMGO[P] ASMD FirstNum SecondNum\n    First <OPERATOR> Second\n");
        return 0;
    } else {
        string input =  argv[1];
        string output = argv[2];
        string oper =   argv[3];
        unsigned long long first =  atoll(argv[4]);
        unsigned long long second = atoll(argv[5]);
        unsigned long i_adjust;
        unsigned long o_adjust;

        i_adjust = inputAdjust(input);
        first *= i_adjust;
        second*= i_adjust;

        if (oper=="D") { // we want to divide so need to use a double rather than long
            double answer;
            answer = dAnswer(first, second);
            outputAnswer(output, answer);
        } else { // otherwise do +, -, or *
            long long answer;
            answer = asmAnswer(oper, first, second);
            outputAnswer(output, answer);
        }

        return 1;
    }
}

基本上它对大数进行数学运算,因为批处理文件只能处理 32 位无符号整数。我可能只使用 VBS 之类的东西,但这是我目前正在使用的解决方案。

我需要程序是独立的,所以它必须静态链接到库。通过替换所有 cout,我能够将大小从 ~570kb 减小到 ~148kb命令 printf ,但我想知道我还能做些什么来减小文件大小。

我正在用 MiniGW 4.6 编译它,这是我目前的编译命令:

g++ -Os -s -static bytemath.cpp -o bytemath.exe

在不重写太多代码的情况下,我还能做些什么来减小文件大小?

谢谢。

编辑

两大储蓄者正在摆脱<iostream><string> ,我可以通过更换我所有的 cout 来做到这一点命令 printf并将我的字符串比较替换为 char* 比较。对于字符,我需要确保访问数组的第 0 个元素并将其与单引号而不是双引号中的字符进行比较(即 if (myinput[0]=='P') { 而不是 if (myinput=="P") { )。

再次感谢大家! 570kb 到 18kb,适合我!

最佳答案

只是一个猜测,但是:删除字符串并用枚举和/或 char* 替换它们。无论如何,您大多使用像枚举这样的字符串,并且输入字符上的简单 if 可以为您提供枚举。

关于c++ - 将 C++ 编译成尽可能小的尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18876965/

相关文章:

Javac 找不到包中确实存在的类

c++ - -Ofast 在使用 long double 时产生不正确的代码

c++ - 单元测试、模拟和 unique_ptr

java - com.sun.tools.javac.code(javac 编译器)包中的这种奇怪语法是什么?它是如何工作的?

c++ - 转换为仅由 char[] 组成的结构并从该数组读取是否定义良好?

编译错误: Fprintf throws parse error

c++ - 禁用编译

c - GCC SSE代码优化

c++ - 为提升精神编译自定义容器时出错

c++ - 在哪里可以看到发布者发送的输出数据?