J'ai une application qui effectue un traitement sur certaines images.
Étant donné que je sais que la largeur/hauteur/format etc. (Je le fais), et de la pensée juste sur la définition d'une mémoire tampon pour stocker les données de pixel:
Alors, plutôt que d'utiliser new
et delete []
sur unsigned char*
et le maintien d'une note séparée de la taille de la mémoire tampon, je pense que je vais simplifier les choses à l'aide d'un std::vector
.
Donc, je voudrais déclarer ma classe à quelque chose comme ceci:
#include <vector>
class MyClass
{
// ... etc. ...
public:
virtual void OnImageReceived(unsigned char *pPixels,
unsigned int uPixelCount);
private:
std::vector<unsigned char> m_pImageBuffer; // buffer for 8-bit pixels
// ... etc. ...
};
Puis, quand j'ai reçu une nouvelle image (de certains de taille variable mais ne vous inquiétez pas à propos de ces détails ici), je peux juste redimensionner le vecteur (si nécessaire) et de copier les pixels:
void MyClass::OnImageReceived(unsigned char *pPixels, unsigned int uPixelCount)
{
// called when a new image is available
if (m_pImageBuffer.size() != uPixelCount)
{
// resize image buffer
m_pImageBuffer.reserve(uPixelCount);
m_pImageBuffer.resize(uPixelCount, 0);
}
// copy frame to local buffer
memcpy_s(&m_pImageBuffer[0], m_pImageBuffer.size(), pPixels, uPixelCount);
// ... process image etc. ...
}
Cela semble bien pour moi, et j'aime le fait que je n'ai pas à vous soucier de la gestion de la mémoire, mais il soulève quelques questions:
- Est-ce une demande valable de
std::vector
ou un récipient approprié? - Suis-je en train de faire la bonne chose en terme de performance en appelant
reserve
etresize
? - Il va toujours être le cas que la mémoire sous-jacente est consécutive afin que je puisse utiliser
memcpy_s
comme le montre?
Tout commentaire supplémentaire, des critiques ou des conseils seraient les bienvenus.