Всем привет!
Вопрос может показаться не актуальным, т.к. дело обстоит со старым компилятором (g++ 4.2.1), но все же интересно разобраться.
Суть вопрос в следующем. Почему если написать программу в одном файле и скомпилировать, а потом разбить ее на модули и собрать программу, скомпилировав каждый файл в отдельности, то на выходе получаются файлы разных размеров (когда одним файлом — существенно меньше, чем та же программа собранная по-модульно):
| Программа одним файлом |
| z.cpp
#include <string>
#include <map>
#include <stdio.h>
#include <stdlib.h>
class A;
class B;
class C;
class C{
public:
std::string _C;
std::map<int,int> __C;
C(){};
~C(){};
void r(){
printf("r\n");
}
;
};
class A{
public:
std::string _A;
std::map<A*,B*> __A;
A(){};
~A(){};
void r(){
C c;
c.r();
}
;
};
class B{
public:
std::string _B;
std::map<A*,B*> __B;
B(){};
~B(){};
void r(){
C c;
c.r();
}
;
};
int main()
{
A a;
B b;
a.r();
b.r();
return 0;
}
Компиляция:
g++ -lstdc++ -DBIG_JOINS=1 -fPIC -lthr -g -lmd -o z z.cpp
Размер выходного файла z = 90550 байт |
| |
| Программа одним файлом |
| a.h
#ifndef _A_
#define _A_
#include <string>
#include <map>
class B;
class A;
class A{
public:
std::string _A;
std::map<A*,B*> __A;
A();
~A();
void r();
};
#endif
a.cpp
#include "c.h"
#include "a.h"
A::A(){};
A::~A(){};
void A::r()
{
C c;
c.r();
}
b.h
#ifndef _B_
#define _B_
#include <string>
#include <map>
class A;
class B{
public:
std::string _B;
std::map<A*,B*> __B;
B();
~B();
void r();
};
#endif
b.cpp
#include "c.h"
#include "b.h"
B::B(){};
B::~B(){};
void B::r()
{
C c;
c.r();
}
c.h
#ifndef _C_
#define _C_
#include <string>
#include <map>
class C{
public:
std::string _C;
std::map<int,int> __C;
C();
~C();
void r();
};
#endif
c.cpp
#include "c.h"
#include <stdio.h>
#include <stdlib.h>
C::C(){};
C::~C(){};
void C::r()
{
printf("r\n");
}
s.cpp
#include "a.h"
#include "b.h"
#include <stdio.h>
#include <stdlib.h>
int main()
{
A a;
B b;
a.r();
b.r();
return 0;
}
Компиляция:
g++ -lstdc++ -DBIG_JOINS=1 -fPIC -lthr -g -lmd -o s a.cpp b.cpp c.cpp s.cpp
Размер выходного файла s = 231472 байт |
| |
К сожалению компилятор не поддерживает опцию -flto, чтобы проверить скажется ли это на размере. Но неужели компилятор/линковщик дублирует библиотеки модулей, а не выкидывает их? Или в чем может быть причина?