Mam program, który intensywnie używa std::map
. W systemie Windows dużo więcej pamięci jest używane pod Linuksem. Czy ktoś ma pomysł, dlaczego tak się dzieje?wykorzystanie pamięci struktur danych STL, Windows vs. linux
Linux: Last process took 42.31 s and used not more than 909 MB (RSS 900 MB) of memory
Windows: Last process took 75.373 s and used not more than 1394 MB (RSS 1395 MB) of memory
Używam gcc 4.4.3 oraz kompilator C++ w wierszu polecenia VS 2010, z ustawieniami uwalnianiu.
EDIT: Niestety za odpowiedzi na pytania, które późno ...
Kod wygląda następująco:
enum Symbol {
...
}
class GraphEntry {
public:
...
virtual void setAttribute (Symbol name, Value * value) = 0;
const Value * attribute (Symbol name) const;
private:
std::map<Symbol, Attribute> m_attributes;
};
class Attribute {
public:
Attribute (Symbol name, Value * val);
...
Symbol name() const;
Value * valuePointer() const;
void setValuePointer (Value * p);
private:
Symbol m_name;
Value * m_value;
};
class Graph : public GraphEntry {
...
public:
Node * newNode (...);
Graph * newSubGraph (...);
Edge * newEdge (...);
...
setSomeAttribute (int x);
setSomeOtherAttribute (float f);
...
private:
std::vector<GraphEntry *> m_entries;
};
Całość opisuje strukturę wykres, który może pomieścić kilka atrybutów jego węzłów i krawędzie. Value
to tylko klasa podstawowa, a pochodne klasy mogą zawierać wartości z dowolnymi typami, takimi jak int
lub std::string
.
EDIT 2: Pod Windows, używam następujące flagi: -DRELEASE -DNDEBUG -DQT_NO_DEBUG -DQT_NO_DEBUG_OUTPUT -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -DNOMINMAX /O2 /MD /Gy /EHsc
EDIT 3: Wykorzystanie pamięci są odczytywane z pliku/proc pod Linux (jak memuse
). W systemie Windows niektóre funkcje WinAPI są wywoływane, ale nie jestem ekspertem w tej dziedzinie, więc to wszystko, co mogę o tym powiedzieć.
EDIT 4: Korzystanie /GS-
i -D_SECURE_SCL
wyników w Last process took 170.281 s and used not more than 1391 MB (RSS 1393 MB) of memory
Czy używasz programu Visual Studio? Jeśli tak, to która wersja? Czy jesteś w debugowaniu? – msandiford
W jaki sposób zmierzyłeś zużycie pamięci? – camh
Kod lub to się nie stało. – Puppy