C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Re: Vider le buffer associe a stdin

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Gabriel Dos Reis
Guest





PostPosted: Fri Nov 05, 2004 4:43 pm    Post subject: Re: Vider le buffer associe a stdin Reply with quote



Laurent Deniau <Laurent.Deniau (AT) cern (DOT) ch> writes:

Quote:
Gabriel Dos Reis wrote:
Laurent Deniau <Laurent.Deniau (AT) cern (DOT) ch> writes:
| Jean-Marc Bourguet wrote:
| > Laurent Deniau <Laurent.Deniau (AT) cern (DOT) ch> writes:
| >>Une question au hasard. Vous gerez comment les exceptions dans votre
| >>code C avec tous ses pointeurs et ses mallocs (ou wrapper
| >>equivalent) si vous avez du C++ comme couche bas niveau du C?
| > Simple: si des exceptions s'echappent de la couche d'interface, il y
| > a
| > un probleme dans celles-ci. Si le code qui se met a utiliser le
| > composant directement n'est pas modifie pour intercepter les
| > exceptions possibles, il y a un probleme dans la modif.
| | Tu veux dire que toutes les methodes C++ de votre couche bas
niveau
| sont qualifiees avec throw(). A ma connaissance ce n'est pas bon pour
| les perfs sauf compilo tres efficace sur un try.
Pardon ?
(Glibc est bourré de throw() et le compilateur optimise à base de
ça).

tu veux dire que le cas particulier de throw() vide est mieux optimise
que de mettre le corps de la fonction dans un try{}catch(...){} ?

Si tu appelles une fonction avec throws(), tu sais qu'au site d'appel,
il n'y aura pas d'exception -- si la fonction essaie d'en lever une
(dans le corps de la fonction), il y a abort(). Donc, au site d'appel
le compilateur ne génère plus du code pour traiter les exceptions
inattendus (destruction des objets déjà construit et toussa).

Par contre si tu places l'appel explicitement dans try/catch, le
compilateur est obligé de dupliquer du code (tests et branchements)
au site d'appel -- et dans certains cas empêcher certaines
optimisations.

Quote:

tu peux m'en dire plus (peut-etre sur f.c.l.c++)? je suis interesse...

a+, ld.

--
Gabriel Dos Reis
[email]gdr (AT) cs (DOT) tamu.edu[/email]
Texas A&M University -- Department of Computer Science
301, Bright Building -- College Station, TX 77843-3112

Back to top
Laurent Deniau
Guest





PostPosted: Fri Nov 05, 2004 5:17 pm    Post subject: Re: Vider le buffer associe a stdin Reply with quote



Gabriel Dos Reis wrote:
Quote:
Laurent Deniau <Laurent.Deniau (AT) cern (DOT) ch> writes:

| Gabriel Dos Reis wrote:
| > Laurent Deniau <Laurent.Deniau (AT) cern (DOT) ch> writes:
| > | Jean-Marc Bourguet wrote:
| > | > Laurent Deniau <Laurent.Deniau (AT) cern (DOT) ch> writes:
| > | >>Une question au hasard. Vous gerez comment les exceptions dans votre
| > | >>code C avec tous ses pointeurs et ses mallocs (ou wrapper
| > | >>equivalent) si vous avez du C++ comme couche bas niveau du C?
| > | > Simple: si des exceptions s'echappent de la couche d'interface, il y
| > | > a
| > | > un probleme dans celles-ci. Si le code qui se met a utiliser le
| > | > composant directement n'est pas modifie pour intercepter les
| > | > exceptions possibles, il y a un probleme dans la modif.
| > | | Tu veux dire que toutes les methodes C++ de votre couche bas
| > niveau
| > | sont qualifiees avec throw(). A ma connaissance ce n'est pas bon pour
| > | les perfs sauf compilo tres efficace sur un try.
| > Pardon ?
| > (Glibc est bourré de throw() et le compilateur optimise à base de
| > ça).
|
| tu veux dire que le cas particulier de throw() vide est mieux optimise
| que de mettre le corps de la fonction dans un try{}catch(...){} ?

Si tu appelles une fonction avec throws(), tu sais qu'au site d'appel,
il n'y aura pas d'exception -- si la fonction essaie d'en lever une
(dans le corps de la fonction), il y a abort(). Donc, au site d'appel
le compilateur ne génère plus du code pour traiter les exceptions
inattendus (destruction des objets déjà construit et toussa).

Je dois avouez que ton explication me melange un peu les pinceaux. Donc
je vais developper:

Quote:
cat g.cpp
void f() throw();


void g() { f(); } // site d'appel, pas d'exception possible ici

Quote:
cat f.cpp
void f() throw();


void f() { // site appelle', possibilite d'une exception
func_qui_peut_lever_une_exception();
}

Je pensais (selon la description du TC++PL3 14.6) que le try-catch
equivalent etait dans le corp de f() autour de l'appel de
func_qui_peut_lever_une_exception(). C'est donc la declaration de void
f() throw() dans f.cpp qui penalise l'efficacite de f() de maniere
generale (pas visible par les autres TU). Je ne pensais pas que g()
aurait egalement du code de protection autour de f() (qui pourrait
effectivement etre optimise) dans g.cpp.

D'autre part, le abort() n'est pas assure si std::unexpected()
std::terminate() sont redefinis, notament si l'utilisateur veut mapper
une exception unexpected sur une exception "expected" (TC++PL3
14.6.3.2). Alors que veux-tu dire par "il y a abort()"?

Je suis d'accord que ce dont tu parles peut s'optimiser si tout est
connu dans la meme TU (f() et g() mais pas necessairement
func_qui_peut_lever_une_exception() par exemple), mais sinon?

Quote:
Par contre si tu places l'appel explicitement dans try/catch, le
compilateur est obligé de dupliquer du code (tests et branchements)
au site d'appel -- et dans certains cas empêcher certaines
optimisations.

Je ne comprends peut-etre pas ce que tu veux dire par site d'appel. Tu
fais allusion a f() ou g() dans l'exemple ci-dessus.

a+, ld.

Back to top
drkm
Guest





PostPosted: Fri Nov 12, 2004 4:42 pm    Post subject: Re: Vider le buffer associe a stdin Reply with quote



[ X-Post f.c.l.c et f.c.l.c++, Fu2 f.c.l.c++. ]

Gabriel Dos Reis <gdr (AT) cs (DOT) tamu.edu> writes:

Quote:
drkm <usenet.fclcxx (AT) fgeorges (DOT) org> writes:

| James Kanze <james.kanze (AT) free (DOT) fr> writes:

| > Il n'y a pas, formellement, une interdiction de surcharge.

| 7.4/6 :

| At most one function with a particular name can have C language
| linkage.

oui, mais tu peux surcharger sur le linkage. Sic.

Je la connaissais pas, celle-là. Comment se passe la résolution de
surcharge ?

--drkm

Back to top
James Kanze
Guest





PostPosted: Fri Nov 12, 2004 7:59 pm    Post subject: Re: Vider le buffer associe a stdin Reply with quote

drkm <usenet.fclcxx (AT) fgeorges (DOT) org> writes:

Quote:
[ X-Post f.c.l.c et f.c.l.c++, Fu2 f.c.l.c++. ]

Gabriel Dos Reis <gdr (AT) cs (DOT) tamu.edu> writes:

drkm <usenet.fclcxx (AT) fgeorges (DOT) org> writes:

| James Kanze <james.kanze (AT) free (DOT) fr> writes:

| > Il n'y a pas, formellement, une interdiction de surcharge.

| 7.4/6 :

| At most one function with a particular name can have C
| language linkage.

oui, mais tu peux surcharger sur le linkage. Sic.

Je la connaissais pas, celle-là. Comment se passe la résolution de
surcharge ?

En fait, je pensais plutôt au fait que tu peux surcharger une fonction
extern "C" avec d'autres fonctions extern "C". Mais le surcharge sur le
linkage marche aussi, comme n'importe quel autre surcharge. (Comme j'ai
dit dans le thread, extern "C" joue sur les types.) Même, il y en a des
cas dans la norme, comme atexit.

Mais pour le petit exemple :

typedef void (*pfCpp)( void * ) ;
extern void f( void* ) ;
extern "C" {
typedef void (*pfC)( void * ) ;
extern void g( void* ) ;
}

void h( pfCpp ) ; // #1
void h( pfC ) ; // #2

h( f ) ; // appelle #1
h( g ) ; // appelle #2

Exactement comme n'importe quel autre surcharge, en fait.

--
James Kanze
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34

Back to top
drkm
Guest





PostPosted: Fri Nov 12, 2004 9:43 pm    Post subject: Re: Vider le buffer associe a stdin Reply with quote

James Kanze <james.kanze (AT) free (DOT) fr> writes:

Quote:
drkm <usenet.fclcxx (AT) fgeorges (DOT) org> writes:

|> [ X-Post f.c.l.c et f.c.l.c++, Fu2 f.c.l.c++. ]

|> Gabriel Dos Reis <gdr (AT) cs (DOT) tamu.edu> writes:

|> > drkm <usenet.fclcxx (AT) fgeorges (DOT) org> writes:

|> > | James Kanze <james.kanze (AT) free (DOT) fr> writes:

|> > | > Il n'y a pas, formellement, une interdiction de surcharge.

|> > | 7.4/6 :

|> > | At most one function with a particular name can have C
|> > | language linkage.

|> > oui, mais tu peux surcharger sur le linkage. Sic.

|> Je la connaissais pas, celle-là. Comment se passe la résolution de
|> surcharge ?

En fait, je pensais plutôt au fait que tu peux surcharger une fonction
extern "C" avec d'autres fonctions extern "C".

Ce qui n'est pas permis, si ?

Quote:
Mais le surcharge sur le
linkage marche aussi, comme n'importe quel autre surcharge. (Comme j'ai
dit dans le thread, extern "C" joue sur les types.) Même, il y en a des
cas dans la norme, comme atexit.

Tiens, dans ce cas, la norme donne les déclarations (18.3/3) :

extern "C" int atexit( void ( * f )( void ) ) ;
extern "C++" int atexit( void ( * f )( void ) ) ;

Est-ce équivalent à :

typedef void ( * funcType )( void ) ;
extern "C" int atexit( funcType ) ;
extern "C++" int atexit( funcType ) ;

ou à (ce que je pense) :

typedef void ( * funcType )( void ) ;
int atexit( funcType ) ;
extern "C" {
typedef void ( * cFuncType )( void ) ;
int atexit( cFuncType ) ;
}

Quote:
Mais pour le petit exemple :

typedef void (*pfCpp)( void * ) ;
extern void f( void* ) ;
extern "C" {
typedef void (*pfC)( void * ) ;
extern void g( void* ) ;
}

void h( pfCpp ) ; // #1
void h( pfC ) ; // #2

h( f ) ; // appelle #1
h( g ) ; // appelle #2

Exactement comme n'importe quel autre surcharge, en fait.

Car le linkage fait partie du système de types. Ce qui me fait dire
que je me suis sans doute un peu mépris lorsque Gaby a dit que l'on
pouvait « surcharger sur le linkage ». J'ai cru qu'il parlait par
exemple de :

extern "C" void f() ;
extern "C++" void f() ;

ce qui m'amenait à la question « comment se passe la résolution de
surcharge dans ce cas ».

Mais si cela n'est pas permis, ok, il s'agit juste de ce que le
linkage fait partie du système de types, et que l'on peut donc jouer
avec dans les types des arguments, dans les surcharges. Et non que le
linkage de la fonction elle-même en permet une surcharge.

Quelle est donc la situation, à cet égard ?

Au fait, n'est-ce pas un peu bizarre de faire intervenir le linkage
dans le système de types ? Quels sont les arguments, pour ou contre ?

--drkm

Back to top
James Kanze
Guest





PostPosted: Sun Nov 14, 2004 1:27 pm    Post subject: Re: Vider le buffer associe a stdin Reply with quote

drkm <usenet.fclcxx (AT) fgeorges (DOT) org> writes:

Quote:
James Kanze <james.kanze (AT) free (DOT) fr> writes:

drkm <usenet.fclcxx (AT) fgeorges (DOT) org> writes:

|> Gabriel Dos Reis <gdr (AT) cs (DOT) tamu.edu> writes:

|> > drkm <usenet.fclcxx (AT) fgeorges (DOT) org> writes:

|> > | James Kanze <james.kanze (AT) free (DOT) fr> writes:

|> > | > Il n'y a pas, formellement, une interdiction de surcharge.

|> > | 7.4/6 :

|> > | At most one function with a particular name can have
|> > | C language linkage.

|> > oui, mais tu peux surcharger sur le linkage. Sic.

|> Je la connaissais pas, celle-là. Comment se passe la
|> résolution de surcharge ?

En fait, je pensais plutôt au fait que tu peux surcharger une fonction
extern "C" avec d'autres fonctions extern "C".

Ce qui n'est pas permis, si ?

C'était évidemment une fautte de frappe. Ce que je voulais dire, c'est
que tu peux surcharger une fonction extern "C" avec d'autres fonctions
extern "C++". C'est ce que je voulais dire par « il n'y a pas
d'interdiction de surcharge » : quelque chose comme :

extern "C" void f( int ) ;
void f( double ) ;

est tout à fait légal, et la fonction extern "C" est bien surchargée.

Quote:
Mais le surcharge
sur le linkage marche aussi, comme n'importe quel autre surcharge.
(Comme j'ai dit dans le thread, extern "C" joue sur les types.)
Même, il y en a des cas dans la norme, comme atexit.

Tiens, dans ce cas, la norme donne les déclarations (18.3/3) :

extern "C" int atexit( void ( * f )( void ) ) ;
extern "C++" int atexit( void ( * f )( void ) ) ;

Est-ce équivalent à :

typedef void ( * funcType )( void ) ;
extern "C" int atexit( funcType ) ;
extern "C++" int atexit( funcType ) ;

ou à (ce que je pense) :

typedef void ( * funcType )( void ) ;
int atexit( funcType ) ;
extern "C" {
typedef void ( * cFuncType )( void ) ;
int atexit( cFuncType ) ;
}

Le deuxième. En revanche, ou je ne suis pas sûr (Gaby ?) :

extern "C" void
f()
{
void (*p)() ;
}

Je crois que p a un type extern "C" aussi, mais je ne suis pas 100% sûr.

Quote:
Mais pour le petit exemple :

typedef void (*pfCpp)( void * ) ;
extern void f( void* ) ;
extern "C" {
typedef void (*pfC)( void * ) ;
extern void g( void* ) ;
}

void h( pfCpp ) ; // #1
void h( pfC ) ; // #2

h( f ) ; // appelle #1
h( g ) ; // appelle #2

Exactement comme n'importe quel autre surcharge, en fait.

Car le linkage fait partie du système de types. Ce qui me fait
dire que je me suis sans doute un peu mépris lorsque Gaby a dit que
l'on pouvait « surcharger sur le linkage ». J'ai cru qu'il parlait
par exemple de :

extern "C" void f() ;
extern "C++" void f() ;

ce qui m'amenait à la question « comment se passe la résolution de
surcharge dans ce cas ».

Mais si cela n'est pas permis, ok, il s'agit juste de ce que le
linkage fait partie du système de types, et que l'on peut donc jouer
avec dans les types des arguments, dans les surcharges. Et non que
le linkage de la fonction elle-même en permet une surcharge.

Je ne crois pas que c'est permis. En tout cas, l'appel serait ambigu,
parce que la résolution du surcharge ne se fait qu'à partir des
paramètres. À une exception près :

extern "C" { typedef void (*pfC)() ; }
extern "C++" { typedef void (*pfCpp)() ; }

pfC p1 = f ; // prend la fonction « extern "C" ».
pfCpp p2 = f ; // prend la fonction « extern "C++" ».

Quote:
Quelle est donc la situation, à cet égard ?

Je crois que c'est illégal, mais je suis loin d'en être sûr.

Quote:
Au fait, n'est-ce pas un peu bizarre de faire intervenir le
linkage dans le système de types ? Quels sont les arguments, pour ou
contre ?

L'argument pour est clair -- on évite une certaine classe d'erreurs. Si
j'ai une fonction qui s'attend à un pointeur vers une fonction C, et par
erreur je lui passe l'adresse d'une fonction C++, c'est une erreur de
compilation, et non un comportement indéfini.

--
James Kanze
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34

Back to top
Gabriel Dos Reis
Guest





PostPosted: Mon Nov 22, 2004 3:16 pm    Post subject: Re: Vider le buffer associe a stdin Reply with quote

drkm <usenet.fclcxx (AT) fgeorges (DOT) org> writes:

Quote:
[ X-Post f.c.l.c et f.c.l.c++, Fu2 f.c.l.c++. ]

Gabriel Dos Reis <gdr (AT) cs (DOT) tamu.edu> writes:

drkm <usenet.fclcxx (AT) fgeorges (DOT) org> writes:

| James Kanze <james.kanze (AT) free (DOT) fr> writes:

| > Il n'y a pas, formellement, une interdiction de surcharge.

| 7.4/6 :

| At most one function with a particular name can have C language
| linkage.

oui, mais tu peux surcharger sur le linkage. Sic.

Je la connaissais pas, celle-là. Comment se passe la résolution de
surcharge ?

Comme dans les autres cas.

-- Gaby

Back to top
drkm
Guest





PostPosted: Tue Nov 23, 2004 3:19 am    Post subject: Re: Vider le buffer associe a stdin Reply with quote

Gabriel Dos Reis <gdr (AT) cs (DOT) tamu.edu> writes:

Quote:
drkm <usenet.fclcxx (AT) fgeorges (DOT) org> writes:

| [ X-Post f.c.l.c et f.c.l.c++, Fu2 f.c.l.c++. ]

| Gabriel Dos Reis <gdr (AT) cs (DOT) tamu.edu> writes:

| > oui, mais tu peux surcharger sur le linkage. Sic.

| Je la connaissais pas, celle-là. Comment se passe la résolution de
| surcharge ?

Comme dans les autres cas.

C'est à dire que le linkage fait partie du système de type, et que
la résolution est faire sur les argument de la fonction ?

--drkm

Back to top
Gabriel Dos Reis
Guest





PostPosted: Tue Nov 23, 2004 4:38 am    Post subject: Re: Vider le buffer associe a stdin Reply with quote

drkm <usenet.fclcxx (AT) fgeorges (DOT) org> writes:

Quote:
Gabriel Dos Reis <gdr (AT) cs (DOT) tamu.edu> writes:

drkm <usenet.fclcxx (AT) fgeorges (DOT) org> writes:

| [ X-Post f.c.l.c et f.c.l.c++, Fu2 f.c.l.c++. ]

| Gabriel Dos Reis <gdr (AT) cs (DOT) tamu.edu> writes:

| > oui, mais tu peux surcharger sur le linkage. Sic.

| Je la connaissais pas, celle-là. Comment se passe la résolution de
| surcharge ?

Comme dans les autres cas.

C'est à dire que le linkage fait partie du système de type, et que
la résolution est faire sur les argument de la fonction ?

Oui -- et dans le cas où on prend implicitement l'adresse de la
fonction, le type de destination joue pour sélectionner la bonne
fonction.

-- Gaby

Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Tue Nov 23, 2004 4:09 pm    Post subject: Re: Vider le buffer associe a stdin Reply with quote

Gabriel Dos Reis <gdr (AT) integrable-solutions (DOT) net> wrote

Quote:
drkm <usenet.fclcxx (AT) fgeorges (DOT) org> writes:

| Gabriel Dos Reis <gdr (AT) cs (DOT) tamu.edu> writes:

| > drkm <usenet.fclcxx (AT) fgeorges (DOT) org> writes:

| > | Gabriel Dos Reis <gdr (AT) cs (DOT) tamu.edu> writes:

| > | > oui, mais tu peux surcharger sur le linkage. Sic.

| > | Je la connaissais pas, celle-là. Comment se passe la
| > | résolution de surcharge ?

| > Comme dans les autres cas.

| C'est à dire que le linkage fait partie du système de type, et que
| la résolution est faire sur les argument de la fonction ?

Oui -- et dans le cas où on prend implicitement l'adresse de la
fonction, le type de destination joue pour sélectionner la bonne
fonction.

Aussi quand on en prend l'adresse explicitement, non ?

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Back to top
Gabriel Dos Reis
Guest





PostPosted: Tue Nov 23, 2004 4:43 pm    Post subject: Re: Vider le buffer associe a stdin Reply with quote

[email]kanze (AT) gabi-soft (DOT) fr[/email] writes:

Quote:
Gabriel Dos Reis <gdr (AT) integrable-solutions (DOT) net> wrote in message
news:<m3mzx9kwmq.fsf (AT) uniton (DOT) integrable-solutions.net>...
drkm <usenet.fclcxx (AT) fgeorges (DOT) org> writes:

| Gabriel Dos Reis <gdr (AT) cs (DOT) tamu.edu> writes:

| > drkm <usenet.fclcxx (AT) fgeorges (DOT) org> writes:

| > | Gabriel Dos Reis <gdr (AT) cs (DOT) tamu.edu> writes:

| > | > oui, mais tu peux surcharger sur le linkage. Sic.

| > | Je la connaissais pas, celle-là. Comment se passe la
| > | résolution de surcharge ?

| > Comme dans les autres cas.

| C'est à dire que le linkage fait partie du système de type, et que
| la résolution est faire sur les argument de la fonction ?

Oui -- et dans le cas où on prend implicitement l'adresse de la
fonction, le type de destination joue pour sélectionner la bonne
fonction.

Aussi quand on en prend l'adresse explicitement, non ?

Exact.

(J'avais une façon particulière de prendre l'adresse en tête ; ce qui
a donné lieu à cette formulation).

-- Gaby

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.