58 votes

N'nouveau char effectivement garantir aligné mémoire pour un type de classe?

Alloue un tampon via new char[sizeof(T)] garanti pour allouer de la mémoire qui est aligné correctement pour le type T,, où tous les membres de l' T a leur naturel, la mise en œuvre définies, l'alignement (qui est, vous n'avez pas utilisé l' alignas mot-clé à modifier leur alignement).

J'ai vu cette garantie faite dans les quelques réponses ici, mais je ne suis pas tout à fait clair comment la norme arrive à cette garantie. 5.3.4-10 de la norme donne l'exigence de base: pour l'essentiel, new char[] doit être aligné à la max_align_t.

Ce qui me manque, c'est le bit qui, dit - alignof(T) sera toujours valide l'alignement avec une valeur maximale de max_align_t. Je veux dire, il semble évident, mais il doit l'résultant de l'alignement d'une structure à la plupart des max_align_t? Même point 3.11-3 dit prolongée alignements peuvent être pris en charge, donc peut le compilateur décide de son propre classe est une sur-alignés type?

18voto

James Kanze Points 96599

Les expressions new char[N] et new unsigned char[N] sont garantis à la mémoire de retour suffisamment harmonisées pour n'importe quel objet. Voir §5.3.4/10 "[...] Pour les tableaux de char et unsigned char, la différence entre le résultat de la nouvelle-expression et l'adresse retournée par l'attribution la fonction doit être un multiple entier de la plus stricte fondamentaux l'alignement exigence (3.11) de tout type d'objet dont la taille est plus grande que la taille du tableau en cours de création. [ Note: en Raison de l'allocation les fonctions sont supposées renvoient des pointeurs de stockage bien harmonisés pour les objets de tout type avec fondamentale l'alignement, cette contrainte sur le tableau d'allocation des frais généraux permet à l' commune idiome de l'allocation des tableaux de caractères dans lequel les objets d'autres les types vont ensuite être placé. -la note de fin ]".

À partir d'une stylistique point de vue, bien sûr: si ce que vous voulez est d'allouer raw de mémoire, c'est plus clair de dire: operator new(N). Sur le plan conceptuel, new char[N] crée N char; operator new(N) alloue N octets.

6voto

Matthieu M. Points 101624

Ce qui me manque, c'est le bit qui, dit - alignof(T) sera toujours valide l'alignement avec une valeur maximale de max_align_t. Je veux dire, il semble évident, mais il doit l'résultant de l'alignement d'une structure à la plupart des max_align_t ? Même point 3.11-3 dit prolongée alignements peuvent être pris en charge, donc peut le compilateur décide de son propre classe est une sur-alignés type ?

Comme l'a noté Mankarse, le meilleur devis que j'ai pu obtenir est de [base.aligner]/3:

Un type ayant une extension de l'alignement exigence est une sur-alignés type. [ Note: tous les plus aligné type est, ou contient, un type de classe à qui s'étendait à l'alignement s'applique (éventuellement par l'intermédiaire d'un non-membre de données statiques). -la note de fin ]

ce qui semble impliquer que l'étendue de l'alignement doit être explicitement requis (et se propage alors), mais ne peut pas

J'aurais préférer une meilleure mention; l'intention est évidente pour un compilateur-écrivain, et tout autre comportement serait fou, encore...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X