2013-04-13 3 views
3

누출 : 이QString 년대는

QVector< QPair<qint32, QString> > vector(10000000); 
QString temp; 
for (int i = 0; i < 10000000; ++i) 
{ 
    temp = QString::fromUtf8("Vasya"); 
    vector.replace(i, qMakePair(i, temp)); 
} 

내 프로그램이 RAM 470 메가 바이트 사용하며,이 때

QVector< QPair<qint32, QString> > vector(10000000); 
QString temp2 = "Vasya"; 
for (int i = 0; i < 10000000; ++i) 
{ 
    vector.replace(i, qMakePair(i, temp2)); 
} 

만 90메가바이트입니다 RAM의?

+0

Dewfy가 대답했지만 Qt의 암시 적 공유 (QString은 암시 적으로 공유 된 클래스 임)에 대한 추가 정보 - http : // qt-project에 관심이 있습니다. org/doc/qt-5.0/qtcore/implicit-sharing.html – Linville

답변

2

내부적으로 QString은 const 개체의 메모리를 공유하도록 최적화되어 있기 때문입니다. 첫 번째 경우는 fromUtf8이 호출 될 때마다 메모리를 할당해야합니다. 반대편의 두 번째 경우에는 항상 기존 const의 메모리를 다시 사용할 수 있습니다. temp2

+1

묵시적인 공유가 일어나야 만하지만 OP의'vector'는 const가 아닙니다 ... 아마도 copy-on-write 의미론이 여기서 일어납니다. –