Создает ли разыменование указатель копию в этом примере?

Я пытаюсь оптимизировать некоторый код, потому что я должен многократно рисовать одну и ту же QPixmap на большую. Поскольку передача QPixmap по значению в моих собственных методах создала бы копии при каждом вызове, я подумал, что смогу сэкономить время, работая с указателями на QPixmaps. Тем не менее, кажется, моя работа была в духе. Я думаю, это потому, что вызов QPainter :: drawPixmap (…, const QPixmap&, …) создает копию этого.

QPixmap *pixmap = new QPixmap(10,10);
painter.drawPixmap(0,0, *pixmap);

Копия создается в этом примере?

Если так, как я могу оптимизировать отрисовку множества изображений на другое?

Я уже прочитал это Q / A здесь: Делает ли разыменование указатель его копию? но определенный ответ для моего конкретного случая ускользает от меня.

1

Решение

Согласно Ссылка на класс QPixmap:

Объекты QPixmap могут передаваться по значению, поскольку класс QPixmap
использует неявный обмен данными. Для получения дополнительной информации см. Неявный
Документация для обмена данными.

Реализация QPixmap:

QPixmap::QPixmap(const QPixmap &pixmap)
: QPaintDevice()
{
if (!qt_pixmap_thread_test()) {
init(0, 0, QPixmapData::PixmapType);
return;
}
if (pixmap.paintingActive()) {                // make a deep copy
operator=(pixmap.copy());
} else {
data = pixmap.data;
}
}

Только когда растровое изображение становится активным, вам понадобится глубокая копия, иначе новому растровому изображению нужно будет только скопировать указатель оригинальных данных.

Для различия константной ссылки и указателя:

QPixmap largeMap(1000, 1000);
QPainter p(&largeMap);

int count = 100000;
qint64 time1, time2;
QPixmap *pSmallMap = new QPixmap("e:/test.png");
QPixmap smallMap = QPixmap("e:/test.png");

time1 =  QDateTime::currentMSecsSinceEpoch();
for (int i = 0; i < count; ++i) {
p.drawPixmap(0, 0, *pSmallMap);
}
time2 =  QDateTime::currentMSecsSinceEpoch();;
qDebug("def time = %d\n", time2 - time1);

time1 =  QDateTime::currentMSecsSinceEpoch();
for (int i = 0; i < count; ++i) {
p.drawPixmap(0, 0, smallMap);
}
time2 =  QDateTime::currentMSecsSinceEpoch();;
qDebug("normal time = %d\n", time2 - time1);

компилировать под визуальную студию 2010 отлаживать Конфигурация будет производить следующую сборку:

    28:         p.drawPixmap(0, 0, *pSmallMap);
003B1647 8B 55 C4             mov         edx,dword ptr [ebp-3Ch]  //the pixmap pointer
003B164A 52                   push        edx
003B164B 6A 00                push        0  //x
003B164D 6A 00                push        0  //y
003B164F 8D 4D F0             lea         ecx,[ebp-10h]  //the qpainter pointer
003B1652 FF 15 9C D7 3B 00    call        dword ptr [__imp_QPainter::drawPixmap (3BD79Ch)]

35:         p.drawPixmap(0, 0, smallMap);
003B16A8 8D 4D E0             lea         ecx,[ebp-20h]  //the pixmap pointer
003B16AB 51                   push        ecx
003B16AC 6A 00                push        0              //x
003B16AE 6A 00                push        0              //y
003B16B0 8D 4D F0             lea         ecx,[ebp-10h]  //the qpainter pointer
003B16B3 FF 15 9C D7 3B 00    call        dword ptr [__imp_QPainter::drawPixmap (3BD79Ch)]

Между этими двумя значениями не должно быть различий, потому что компилятор выдаст один и тот же код сборки: передайте указатель в функцию drawPixmap.

И QDateTime :: currentMSecsSinceEpoch () почти показывает тот же результат на моей коробке.

0

Другие решения

Функция drawPixmap занимает const ссылка на pixmap, так что копия не делается. Вот прототип для функции-члена QPainter:

  void  drawPixmap ( int x, int y, const QPixmap & pixmap )
4

По вопросам рекламы [email protected]