Realloc équivalent en C++
Oui, un autre realloc
vs std::vector
question. Je sais ce que vous allez dire, et je suis d'accord, oubliez manuel de l'allocation de la mémoire, et il suffit d'utiliser un std::vector
. Bien malheureusement, mon professeur m'a interdit d'utiliser quoi que ce soit à partir de la STL pour cette mission.
Donc oui, j'ai un tableau dynamique de T
et j'en ai besoin pour être redimensionnables, et je ne peux pas utiliser std::vector
. Je pourrais retourner à l'âge des ténèbres et faire la même chose avec malloc
et de la famille, mais si je pouvais utiliser new
qui serait totalement génial.
J'ai lu beaucoup de discussions où tout le monde a dit "non, vous ne pouvez pas le faire, utilisez std::vector
", mais ils ont tous été posté avant le mois d'août 2011, et je suis en espérant contre tout espoir que quelque chose peut-être changé depuis l'aube de C++11. Alors, dites-moi, suis-je de la chance, ou dois-je revenir à un style C allocation mémoire?
std::vector
n'est pas dans la STL, c'est dans la norme C++ de la bibliothèque.Vous ne pouvez pas si vous voulez que votre code fonctionne.
ce H2CO3 est se rapportant à, est le fait que la STL est un ancien nom de la vétusté de la 3e partie de la bibliothèque, et de nos jours ce qui est à tort-que la STL est toute la partie de la bibliothèque standard de C++. Découvrez qu'est ce Que c'STL vs "C++ Standard Library" combat? si vous êtes intéressé..
tu veux dire
malloc
suivie par une copie, et parfois, il est, mais si il ya de la place, realloc
ne pas faire de copie, il sera tout simplement allouer plus d'espace.tout ce que vous voulez raconter, me semble prometteuse, pourriez-vous poster une réponse où vous aller dans le détail?
OriginalL'auteur Michael Dorst | 2013-02-25
Vous devez vous connecter pour publier un commentaire.
Vous devriez éviter de
realloc
complètement de toute façon, parce que vous ne pouvez pas déplacer des objets en C++ comme ça.buf = new unsigned char[sizeof(T) * capacity]
pour créer un nouveau tamponunsigned char *
àT *
et l'utilisation de cesT
-pointeurs à partir de maintenantnew
", comme dansnew (&buf[i]) T(original_copy)
std::uninitialized_copy
(passtd::copy
), puis de détruire les éléments de l'ancienne à l'aide debuf[i].~T()
et de libérer l'ancien tampon à l'aide dedelete [] buf
.Tout cela, c'est en supposant que vous n'avez pas à vous inquiéter au sujet de l'exception de sécurité, ce qui est probablement OK pour la cession.
Juste être conscient que dans le monde réel, le code que vous auriez à garantir exception de sécurité et c'est un beaucoup plus fastidieux que cela.
static_cast<T*>(::operator new(sizeof(T) * cap))
d'obtenir la mémoire, si quoi que ce soit. Utilisez ensuite le placement de nouvelles à coller des choses à. De cette façon, vous pouvez utiliser une forme normale de l'arithmétique à la marque de votre première, la dernière et la fin. Je dirais même cette overcomplicates choses pour une mission, et qu'il suffit de faire un tout droitnew T[capacity]
et nécessitent par défaut de constructibilité.Je ne comprends pas, pourquoi est -
new unsigned char[]
mauvais, et comment est -::operator new()
mieux? Concernant le défaut de constructibilité: s'il va à l'itinéraire, puis il doit également utiliser desstd::copy
.L'idée est que vous avez explicitement tapé la mémoire.
Pourriez-vous élaborer? Je ne suis pas sûr de ce que tu veux dire. Ce n'est pas tout explicitement tapé dans mon cas?
Re "vous ne pouvez pas déplacer des objets en C++ comme ça", et bien, bien que std::vector ne peut pas être fait pour utiliser realloc en général, il fait exactement déplacer des objets en C++ comme ça. Le problème n'est pas avec realloc, mais avec la conception de conteneurs (ce qui nécessite une simple standard allocateurs).
realloc
serait de fournir une très belle performance de coup de pouce pour un container, pas de problème (de plus que le problème de mise en œuvre destd::vector
, qui est).OriginalL'auteur Mehrdad
Le problème avec
realloc
est que c'est peut déplacer les données existantes à une autre plage d'adresses contiguës. S'il a besoin de le faire, étant donné que c'est une fonction C les données sont copiées sans aucun clin d'œil à l'objet C++ durée de vie:Cela peut entraîner des conséquences fatales - par exemple, lorsque les objets déplacés contiennent des pointeurs/références qui restent de pointer les adresses dans la zone de mémoire d'être libérés.
Malheureusement, normal
malloc
implémentations ne laissez pas un rappel crochet vous permettant de remplacer la mémoire du contenu de la copie de code avec votre propre C++-mise en œuvre sûre. Si vous êtes déterminé, vous pouvez essayer de trouver un moyen plus souple de "malloc" de la bibliothèque, mais il est peu probable d'être en valeur la dispute et le risque.Par conséquent, dans le cas général, vous devez utiliser
new
pour changer votre capacité, copier/déplacer chaque objet, etdelete
les originaux par la suite.Si vous êtes certain que vos données est assez simple pour un
memcpy
style de réinstallation ne cause pas de conséquences négatives, alors vous pouvez utiliserrealloc
(à vos risques et périls).OriginalL'auteur Tony Delroy