Мне интересно, как мне следует собирать относительно простой скрипт C++ до наименьшего возможного исполняемого размера.Компиляция 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, но это решение, с которым я сейчас работаю.
Мне нужно, чтобы программа была автономной, поэтому она должна статически ссылаться на библиотеки. Я смог получить размер от ~ 570kb до ~ 148kb, заменив все команды cout
printf
, но мне интересно, что еще я могу сделать, чтобы уменьшить размер файла.
Я компиляция это с MiniGW 4.6, и это моя команда компиляции на данный момент:
g++ -Os -s -static bytemath.cpp -o bytemath.exe
Что еще я могу сделать, чтобы уменьшить размер файла, не слишком много коды переписывать?
Спасибо.
EDIT
Две большие вкладчики избавлялись от <iostream>
и <string>
, что я был в состоянии сделать, заменив все мои cout
команды с printf
и заменить мои сравнения строк с голец * сравнение. Для символов мне нужно было получить доступ к 0-му элементу массива и сравнить его с символом в одинарных кавычках, а не с двойными кавычками (т. Е. if (myinput[0]=='P') {
, а не if (myinput=="P") {
).
Еще раз спасибо всем! 570kb до 18kb, работает для меня!
Вам действительно не нужен весь вызов printf, который у вас есть. Используйте ваши операторы if для вычисления значений, которые вы хотите вывести, а затем на конце вывода с одним printf. – andre
Я сделал это так, потому что иногда я выводил «длинный длинный», а иногда я выводил «float». Прошло некоторое время с тех пор, как я использовал C++, но для меня это было проще.Используя приведенный ниже совет, чтобы заменить все экземпляры 'string' на' char * ', работал, но я бы предположил, что это тоже поможет, но время, которое потребуется для исправления, не приведет к экономии пространства для этого проекта (теперь это до 18 КБ). Спасибо за отзыв, хотя! – romellem