У меня есть программа, которая интенсивно использует std :: map
. В Windows используется гораздо больше памяти, чем в Linux. Кто-нибудь знает, почему это происходит?
Linux:
Последний процесс занял 42,31 с и использовал не более 909 МБ (RSS 900 МБ) памяти
Windows:
Последний процесс занял 75,373 с и использовал не более 1394 МБ (RSS 1395 МБ) памяти
Я использую gcc 4.4.3 и компилятор VS 2010 C ++ в командной строке с настройками выпуска.
РЕДАКТИРОВАТЬ. : Извините за столь поздний ответ на вопросы ...
Код выглядит следующим образом:
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;
};
Все это описывает структуру графа, которая может содержать некоторые атрибуты на своих узлах и краях. Значение
- это просто базовый класс, а производные классы могут содержать значения с произвольными типами, например int
или std :: string
.
РЕДАКТИРОВАТЬ 2:
Под Windows я использую следующие флаги: -DRELEASE -DNDEBUG -DQT_NO_DEBUG -DQT_NO_DEBUG_OUTPUT -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -DNOMINMAX / 3
Использование памяти считывается из файла / proc под Linux (например,
memuse
).
Под Windows вызываются некоторые функции WinAPI, но я не эксперт в этом, так что это все, что я могу сказать об этом.
РЕДАКТИРОВАТЬ 4:
Использование / GS-
и -D_SECURE_SCL
приводит к Последний процесс занял 170,281 с и использовал не более 1391 МБ (RSS 1393 МБ) памяти