L'allocation de structure de longueur variable membre du groupe
Je sais que je peux faire new char[n]
pour créer un tableau de n
caractères. Cela fonctionne même lorsque n
n'est pas une compilation constante de temps.
Mais disons que je voulais une taille variable suivi de n caractères:
Ma première tentative à cet égard est la suivante:
struct Test
{
std::size_t size;
char a[];
};
Cependant, il semble new Test[n]
ne fait pas ce que j'attends, et au lieu alloue n
size
s.
J'ai également constaté que sizeof(std::string)
est de 4 à ideone, de sorte qu'il semble qu'on puisse attribuer à la fois la taille et le char tableau dans un seul bloc.
Est-il un moyen que je puisse réaliser ce que j'ai décrit (sans doute ce que std::string
déjà fait)?
Si vous utilisez VLAs c'est pas du C++. OK, je vois le titre qui a trompé moi.
Je pense que nous avons une série downvoter sur cette question, les réponses de...
Que penser d'un vecteur? Ou un membre de type string?
Assez facile à faire cuire votre propre classe qui alloue un tableau dynamique, mais quel est le problème avec juste l'aide de
"
Je pense que nous avons une série downvoter sur cette question, les réponses de...
Que penser d'un vecteur? Ou un membre de type string?
Assez facile à faire cuire votre propre classe qui alloue un tableau dynamique, mais quel est le problème avec juste l'aide de
string
ou vector<char>
?"
sizeof(std::string)
est de 4" - wat
OriginalL'auteur Clinton | 2011-10-03
Vous devez vous connecter pour publier un commentaire.
Pendant que vous peut le faire (et il a souvent été utilisé dans C dans une solution de contournement de toutes sortes), il est recommandé de ne pas le faire. Cependant, si c'est vraiment ce que vous voulez faire... voici une façon de le faire avec la plupart des compilateurs (y compris ceux qui ne jouent pas bien avec C99 améliorations).
Le C spécifications avant C99 ne permettent pas un zéro-longueur de la matrice au sein d'une structure. Pour contourner ce problème, un tableau à un seul élément est créé, et un de moins que la demande de l'élément de comptage est ajoutée à la taille de la structure réelle (la taille et le premier élément) pour créer la taille prévue.
size_t
avecshort
, etchar
àlong
, aboutissant à tous leslong
s n'étant pas alignés correctement (ou, sinon, de ne pas accorder assez d'espace)?Sauf si vous utilisez le compilateur directives pour définir manuellement l'emballage de la structure, si vous avez eu une
short
en tant que premier membre et défini la matrice commelong
, le compilateur pourrait commencer à lashort
à l'octet 0 (par le biais de l'octet 1), passez octets 2 à 7, puis commencer à leslong
à l'octet 8 (en gardant correctement alignés). Ensuite, chaquelong
alloué/consulté après qui seraient sur un alignement de 8 octets.Adam: Ah oui, je vois maintenant.
Cela fonctionne parce que
sizeof(Test)
permettra de résoudre à 8 (par mon commentaire ci-dessus), car la taille de la structure comprendra le vide octets utilisés pour l'alignement. Si vous avez essayé d'allouer à l'aide desizeof(short) + (sizeof(long) * x)
, vous serait inévitablement allouer trop peu d'espace.Est-il de toute façon pour ce faire avec
new
, ou malloc est la seule option ici? (bien sûr, je vais l'envelopper le tout dans un constructeur, donc ce n'est pas un problème à l'aide de malloc, c'est juste par intérêt).OriginalL'auteur Adam Maras
Vous pouvez utiliser
placement new
:new
, ne pouvait pas y avoir de problèmes potentiels avec l'alignement lorsque vous l'utilisez pour stocker uneTest
? Est-il de toute façon à forcer l'alignement surnew
?Je ne pense pas qu'il y aura des problèmes d'alignement. Si le compilateur insère rembourrage dans la struct puis sizeof() rapport, de sorte que le remplissage sera compté dans la mémoire allouée avec new. Je pense que vous pourriez finir l'allocation de quelques octets supplémentaires avec cet algorithme, mais jamais moins.
alloue de stockage correctement alignés pour tout type avec une taille égale ou inférieure à la taille demandée, ce qui n'est pas un problème ici. Cependant, l'accès à un tableau de l'indice est supérieure ou égale à sa taille est un comportement indéfini. Faites-en ce que vous voulez.
Il serait la cause d'un comportement indéterminé si quelqu'un a essayé d'accéder à des éléments de
t->a
autres quet->a[0]
OriginalL'auteur Miguel
Vous pouvez également utiliser la fonction "Longueur 1 Tableau" truc. C'est dans C:
GCC prend également en charge "de longueur 0" tableaux pour exactement cet effet:
http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
OriginalL'auteur Yann Ramin
Si je comprends bien, vous voulez une classe qui stocke un seul pointeur vers un allouée dynamiquement longueur de préfixe de la chaîne. Vous pouvez le faire en prenant avantage du fait que
char*
pouvez en toute sécurité alias quoi que ce soit.Une implémentation simpliste, juste pour montrer à quel il peut être fait:
Je pense qu'il n'. Lit de la question "(...) il semble qu'on puisse attribuer à la fois la taille et le char tableau dans un seul bloc.", qui est exactement ce que ce n'. Je vais laisser les OP décider.
Ne pas allouer l'objet de façon dynamique et tout à coup il y a une seule couche d'indirection. Comme la plupart des classes de corde: à qui
std::unique_ptr<std::string>(new std::string)
?OriginalL'auteur R. Martinho Fernandes
Gardons les choses à court et doux en C++ à l'aide de
std::vector
.Eh bien, quelqu'un est sur en bas à droit de vote de la spree.
sizeof(size)
est toujours le même, donc je ne pense pasa(new sizeof(size))
est ce que tu voulais dire (même si vous avez corrigé la syntaxe).Je vois ce que vous dites. J'ai juste fait une simple erreur stupide.
Cela va à l'encontre du but de combiner les attributions de la structure et de la matrice.
OriginalL'auteur Mahesh