Accueil > Forum > > > > Références, instance locale, réflexion
Références, instance locale, réflexion
jeudi 7 février 2008 à 18:21:55 |
Références, instance locale, réflexion

Bombela
|
Salut,
Travaillant sur un projet relativement important en ce moment, et afin d'obtenir du compilateur toutes les optimisations et sécurité de code possible, j'use et abuse des références.
J'ai fini par en placé une à un endroit qui me semblait en premier abord invalide. Le compilateur ne dit rien, et le memchecker (valgrind) non plus.
Avant de poser mon raisonnement, voici le code d'exemple :
typedef std::list ObjList.
ObjList Func(void)
{
ObjList r;
return r;
}
int main(void)
{
ObjList &A = Func();
}
Ai-je bon si je dit la chose suivante ?
_ Dans la fonction main, une instance locale de type ObjList est alloué pour
réceptionner le retour de la fonction Func.
_ Une référence sur cette instance est placé en A.
_ À la sortie de la fonction main, l'instance locale de type ObjList est détruite comme toute variable locale.
Merci d'avance ;)
++
|
|
vendredi 8 février 2008 à 18:02:25 |
Re : Références, instance locale, réflexion

luhtor
|
Réponse acceptée !
Non ca ne fonctionne pas. Derrière une référence, c'est un pointeur, or tu essais d'initialiser une référence (ou un pointeur) sur un objet qui va etre détruit immédiatement. Pour mettre une référence, il faut que ton objet de base ait une durée de vie supérieure à ta référence, or ici ce n'est pas le cas. Le compilo doit te le dire de toute facon.
|
|
vendredi 8 février 2008 à 18:46:34 |
Re : Références, instance locale, réflexion

juju12
|
Réponse acceptée !
Euh Luthor, après test, la fonction crée une copie de l'objet dans main() (c'est normal), mais attend la fin de la fonction pour la détruire comme on s'en sert, donc il semblerait que Bombela ait raison : code test : class A {public: ~A(void){printf("A Destructor\n");};};A Test( void){A a;return a;}int _tmain(int argc, _TCHAR* argv[]) { A& a=Test(); printf("Wait...\n"); return 0; }
résultat : A Destructor Wait... A Destructor
|
|
vendredi 8 février 2008 à 19:08:29 |
Re : Références, instance locale, réflexion

Bombela
|
Le compilateur accepte ce code sans problème (g++ 4.1 sous GNU/Linux, Visual 2005 sous Windows)... dans le cas où la référence est déclarée constante :
const A& a=Test();
J'ai fait plein de teste avec des "printf" partout dans le constructeur, destructeur, constructeur de copie, et opérateur d'affectation.
Ce que dis luthor est exacte dans le cas où A& a=Test();
Ce que dis juju12 est exacte dans le cas où const A& a=Test();
De plus l'objet retourné n'est pas copié. J'ai bien vérifié, même en désactivant les optimisations (et en déclarant "a" comme simple objet).
J'imagine que le compilateur prévoir le coup quand il voit un appelle de fonction renvoyant l'objet, et alloue d'avance l'espace dans la pile, que sera utilisé par la fonction directement. (En effet, ça beau être un paramètre de retour, il ne tient pas dans le registre rax/eax [64/32bits]).
Code :
#include
using namespace std;
struct A {
~A(void)
{
cout << "A Destructor" << endl;
}
};
A Func(void)
{
A r;
return r;
}
int main (int argc, char const* argv[])
{
A& a =Func();
cout << "main" << endl;
return 0;
}
g++ toto.cpp
toto.cpp: In function «int main(int, const char**)":
toto.cpp:20: erreur: invalid initialization of non-const reference of type «A&" from a temporary of type «A"
Alors que la même chose avec un const :
g++ toto.cpp && ./a.out
main
A Destructor
Merci à vous deux.
ps : et sinon comment on met une balise code ?
|
|
vendredi 8 février 2008 à 19:11:15 |
Re : Références, instance locale, réflexion

Bombela
|
Petit ajout :
Je n'ai pas testé sans la constante avec Visual 2005, peut être que cela passe ?
Le compilateur de Microsoft à toujours été plus laxiste, c'est peut être pourquoi ça marche pour juju12...
|
|
vendredi 8 février 2008 à 19:32:12 |
Re : Références, instance locale, réflexion

luhtor
|
int fonction() { return 0; };
int main(int argc, char * argv[]) { int & ref1 = fonction(); ... };
Ca ne compile pas sous VC2005 et heureusement. Par contre la version "const int & ref = fonction()" compile correctement. Ca reste un peu un mystere pour moi, pk la version "const" est acceptée et pas la version "non const". Mais on utilise très souvent ceci. Ex:
void ma_fonction(const std::string &);
Lors de l'appel, le fait que l'argument soit "const" nous permet de déclarer la variable directement lors de l'appel: ma_fonction(std::string("coucou")); // <= chose impossible si l'argument n'est pas const.
|
|
vendredi 8 février 2008 à 19:34:54 |
Re : Références, instance locale, réflexion

luhtor
|
Correction, ceci compile et ca me rappelle que j'avais eu des gags avec ca:
class objet { public: objet() {} };
objet fonction() { return objet(); };
int main(int argc, char * argv[]) { objet & ref1 = fonction(); const objet & ref2 = fonction(); ... };
Franchement, je trouve ca très limite de la part du compilo. Ce code compile dans le cas d'une classe, pas dans le cas d'un entier. Enfin peut etre que le mieux est d'éviter d'écrire ce genre d'abération...
|
|
vendredi 8 février 2008 à 20:12:15 |
Re : Références, instance locale, réflexion

Bombela
|
Tu compile avec Visual ?
Car gcc ne me permet pas de fait ça, aussi bien dans le cas d'un type de base qu'avec une classe.
J'ai eu à travailler sur du code écris dans Visual C++ pour le porter sous gcc et GNU/Linux. Visual permet apparemment tout un tas de de chose irrespectueuses des standards. Mais je crois que cela s'inscrit dans la politique de Microsoft.
Sinon bonne remarque pour le "ma_fonction(std::string("coucou"));"
C'est vrai que c'est finalement étrange que cela fonctionne dans le cas d'un const, et pas dans le cas contraire.
Bien sur, "void ma_fonction(const std::string &);" indique clairement au compilo un objet en lecture seule, donc "ma_fonction(std::string("coucou"));" est parfaitement logique.
Par contre "void ma_fonction(std::string &);" pourrait indiquer que l'objet référencer sera modifier dans la fonction... ok mais... en quoi cela concerne "ma_fonction(std::string("coucou"));" ? Car après tout l'objet est créé temporairement, modifié par ma_fonction (supposition) et détruit... Certes, c'est pas logique et c'est peut être pour ça que la compilateur n'est pas d'accord ! Qu'en pensez-vous ?
++
|
|
samedi 9 février 2008 à 11:52:08 |
Re : Références, instance locale, réflexion

luhtor
|
void fonction2(objet &) { };
... fonction2(objet());
Ceci est accepté par visual. En tout rigueur, ca me choque pas. L'objet est créé localement lors de l'appel de la fonction et modifiable. Mais en pratique, je vois pas l'intérêt.
Pour ceci: objet fonction()
... objet & ref = fonction(); // ou ceci objet * ptr = &fonction();
Je considère ca vraiment comme un bug du compilo.
|
|
samedi 9 février 2008 à 14:37:34 |
Re : Références, instance locale, réflexion

Bombela
|
Effectivement... Visual est à l'image de Microsoft ;)
Merci pour tous ces tests !
|
|
Cette discussion est classée dans : instance, locale, références, func, objlist
Répondre à ce message
Sujets en rapport avec ce message
Pas compris les arguments [ par Bog ]
Bonjour.Voila à chaque fois que je me lance dans un projet de programmation C++, je suis tjrs bloqué par certaines choses, surtout les arguments, et c
Pas compris les arguments [ par Bog ]
Bonjour.Voila à chaque fois que je me lance dans un projet de programmation C++, je suis tjrs bloqué par certaines choses, surtout les arguments, et c
tableau d'objet comme variable d'instance [ par MrKribou ]
Bon dans le fichier .h (ou fait c comment qu'on appele se fichier la ? header ?) comment declare ton un tableau d'objet comme variable d'instance.Par
Classes globales sur plusiers fichiers [ par Supo ]
Allo. Je fais un prog utilisant des structs et j'aimerais définir une instance de ma struct qui pourrait être utilisée par plusieurs fichiers. J'ai es
Constructeur sur un tableau de classes [ par Supo ]
Lorsque je crée un tableau de classe, disons avecnomdelaclasse instance[10];et que j'ai un constructeur pour cette classe, comment je fait pour donner
références [VC6] [ par littlefl ]
Je me demandais pourquoi les deux codes suivants ne donnent pas le même résultat :Dans les exemples ci-dessous, 'class1' surcharge l'opérateur de cast
#define [ par ifren ]
bonjour,j'ai ces deux code #ifndef LFAdbuf #define LFAdbuf LFA::__instance()->__buffer="" #endif // LFAdbufet j'ai un autre code #define LFAdbu
Comment recup l'instance du programme... [ par neodelphi ]
Salut tout le monde ! Ayant déja trouvé de l'aide sur ce forum j'y refait un tour ( je commence a y prendre gout lol ).Bon voila mon probleme : j'ai c
socket unix locale [ par gaussdelphine ]
je souhaite faire un envoi de socket unix de domaine AF_UNIX avec la même adresse pour le client et le serveur.Est ce que c'est possible??J'obtiens un
Passer une instance de classe dans une mémoire partagée ?? [ par vinvay ]
Comment puis-je passer une instance de classe dans une shared memory, sachant que cette classe contient une structure. J'arrive, dans le deuxième prog
Livres en rapport
|
Derniers Blogs
[SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|