2010-10-19 6 views
0

je suit deux classes:sera la mémoire de réserve du compilateur pour cet objet?

template <size_t size> 
class Cont{ 
public: 
char charArray[size]; 
}; 
template <size_t size> 
class ArrayToUse{ 
public: 
Cont<size> container; 
inline ArrayToUse(const Cont<size+1> & input):container(reinterpret_cast<const Cont<size> &>(input)){} 
}; 

J'ai trois lignes suivantes de code à périmètre global:

const Cont<12> container={"hello world"}; 
ArrayToUse<11> temp(container); 
char (&charArray)[11]=temp.container.charArray; 

En totalité de mon code La seule utilisation de l'objet « conteneur » est pour l'initialisation un objet de la classe "ArrayToUse" comme mentionné et après l'initialisation de la référence "charArray" à "temp.container.charArray" Je vais utiliser cette référence dans le reste de mon code, maintenant je me demande la mémoire de réserve du compilateur pour "container" objet puisque cela a un usage temporaire?

+6

Yu ck. – GManNickG

+2

Avant d'obtenir plus de Yucks, peut-être que vous voulez laisser tomber une note sur ce que vous voulez réaliser par ceci ... cette erreur ... ce _thing_. – xtofl

+0

Aidez un noobie C++ à sortir, que fait-il exactement? – dreamlax

Répondre

2

Toute variable définie à l'échelle globale dispose de la mémoire qui lui est réservée au moment de la compilation. Cela ne veut pas dire que l'initialisation est garantie, mais c'est tout de même le cas.

Lors de la liaison, Visual C++ offre l'option strip unused data and functions via /OPT - voir ici.

+0

@flownt - il compile OK pour moi –

+1

oui en regardant de plus près c'est correct mais la syntaxe semble assez mystérieuse. dans tous les cas, la référence ne concerne pas le conteneur mais le sous-objet dans arraytouse, de sorte que le conteneur peut toujours être optimisé. – flownt

+0

@Steve Townsend_Je ne fais pas référence à un objet "container" en utilisant charArray, je fais référence à "temp.container.charArray". – Pooria

0

cela dépend entièrement de votre compilateur particulier donc je dirais inspecter l'ensemble et découvrir! le compilateur pourrait optimiser le conteneur, ou il pourrait négliger de le faire.

0

Le compilateur doit créer la variable container dans le fichier objet compilé. Le lieur est celui qui peut dire si c'est nécessaire ou non (pour un symbole export ed, ou à partir d'une autre unité de compilation si elle est déclarée extern).

Mais ...

Le type Cont<x> est sans rapport avec Cont<x+1>. Vous ne pouvez pas dépendre de la mémoire d'une variable membre disposée de façon similaire. Heck, vous ne pouvez même pas savoir si elle a la même, car il est ce qu'on appelle la « spécialisation de modèle »:

// your code 
template <size_t size> 
class Cont{ 
public: 
char charArray[size]; 
}; 

// my evil tweak 
// I'm the worst compiler ever but I feel that this 
// array would better be represented as a map... 
template<> class Cont<12> { 
    std::map<int,char> charArray; 
}; 

// your screwed up result 
Cont<12> c12; 
Cont<11>& c11(reinterpret_cast<Cont<11>&>(c12)); 
char (&s11)[11] = c11.charArray; // points to the first byte of a list object... 

EDIT - @ Commentaire de UncleBen J'insinue ici exagère. Et il a raison.

selon wikipedia,

  • un pointeur vers un objet POD-struct , converti de manière appropriée en utilisant un plâtre de réinterpréter, pointe vers son élément initial et vice versa, ce qui implique qu'il n'y a remplissage à le début d'une structure POD.

Donc dans ce cas,

  • où le charArray est le premier membre d'un Cont<n>, et il n'y a pas de membres non-POD

  • il n'y a pas d'opérateur d'affectation, ni un destructeur

Il est sans danger.

+0

A moins qu'il y ait une spécialisation, le compilateur a-t-il vraiment son mot à dire sur la façon dont la classe sera mise en mémoire (le décalage du premier membre est 0 et le tableau est contigu)? – UncleBens

+0

@UncleBens: bonne question - je vais chercher autour de l'alignement, l'emballage etc ... – xtofl

Questions connexes