Comment supprimer l'initialisation automatique et la destruction d'un type? Alors qu'il est merveilleux que T buffer[100]
initialise automatiquement tous les éléments de buffer
, et les détruit quand ils tombent hors de portée, ce n'est pas le comportement que je veux.C++ Supprimer l'initialisation automatique et la destruction
#include <iostream>
static int created = 0,
destroyed = 0;
struct S
{
S()
{
++created;
}
~S()
{
++destroyed;
}
};
template <typename T, size_t KCount>
class fixed_vector
{
private:
T m_buffer[KCount];
public:
fixed_vector()
{
// some way to suppress the automatic initialization of m_buffer
}
~fixed_vector()
{
// some way to suppress the automatic destruction of m_buffer
}
};
int main()
{
{
fixed_vector<S, 100> arr;
}
std::cout << "Created:\t" << created << std::endl;
std::cout << "Destroyed:\t" << destroyed << std::endl;
return 0;
}
La sortie de ce programme est:
Created: 100
Destroyed: 100
Je voudrais que ce soit:
Created: 0
Destroyed: 0
Ma seule idée est de faire m_buffer
un certain type trivialement construit et destructed comme char
et puis compter sur operator[]
pour envelopper le calculateur de pointeur pour moi, bien que cela ressemble à une solution horriblement piraté. Une autre solution serait d'utiliser malloc
et free
, mais cela donne un niveau d'indirection que je ne veux pas.
La raison pour laquelle je veux que c'est parce que je fais un récipient et je ne veux pas payer pour les frais généraux d'initialisation des choses que je ne vais pas utiliser. Par exemple, si ma fonction main
était:
int main()
{
{
std::vector<S> vec;
vec.reserve(50);
}
std::cout << "Created:\t" << created << std::endl;
std::cout << "Destroyed:\t" << destroyed << std::endl;
return 0;
}
La sortie serait correct:
Created: 0
Destroyed: 0
Pourquoi diable voulez-vous un tableau d'instances 'S' non construites? Que pouvez-vous utiliser pour? –
Rien - quel est le point. J'ai révisé ma question avec justification. –
Donc, si je vous comprends bien, vous voulez réserver de l'espace dans votre vecteur pour les éléments que vous remplirez plus tard, et vous ne voulez pas payer pour la construction (et la destruction) des éléments deux fois. Cette différence de performance est-elle vraiment importante? Avez-vous profilé votre application et vérifié que c'est là que vous passez le plus de temps lors de l'exécution? –