OVH Cloud OVH Cloud

allocation dynamique sur la pile ?

34 réponses
Avatar
philou2109
Bonjour,
Est-il possible d'allouer sur la pile des tableaux dont la taille est
connue à l'exécution ?
raison : gain de performances par rapport au tas.
Merci

10 réponses

1 2 3 4
Avatar
Fabien LE LEZ
On 04 Dec 2004 14:33:49 +0100, James Kanze :

Mais comme j'ai dit, de bons compilateurs C++ le
supportent déjà, au moins en option.


Et comment se gèrent les problèmes que tu as soulevés dans ton autre
message ?
(<news:)

--
;-)

Avatar
Fabien LE LEZ wrote:
On 04 Dec 2004 14:33:49 +0100, James Kanze :


Mais comme j'ai dit, de bons compilateurs C++ le
supportent déjà, au moins en option.



Et comment se gèrent les problèmes que tu as soulevés dans ton autre
message ?
(<news:)


Aucune idée. Je sais que g++ permet l'utilisation d'une dimension
variable dans un tableau local. Je n'ai jamais essayé plus.

Pour commencer, j'interdirais l'héritage d'une classe qui contenait une
VLA. Pour le new, c'est plus délicat -- je vois mal un type en C++ dont
on ne peut pas faire un new.

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


Avatar
drkm
"@(none)" <""kanze"@(none)"> writes:

Pour commencer, j'interdirais l'héritage d'une classe qui contenait une
VLA.


Je n'arrive pas à trouver d'exemple précis de problème que cela
pourrait poser. J'entrevois peut-être des problèmes avec l'héritage
multiple, mais je ne connais pas assez le sujet pour trouver un
exemple particulier.

Tu as des exemples précis en tête ?

--drkm

Avatar
Fabien LE LEZ
On Sun, 05 Dec 2004 01:32:46 +0100, drkm :

Pour commencer, j'interdirais l'héritage d'une classe qui contenait une
VLA.


Je n'arrive pas à trouver d'exemple précis de problème que cela
pourrait poser.


Il me semble que ceci suffirait à poser problème :

struct B
{
char tableau [*]; // Pas sûr de la syntaxe
};

struct D : B
{
int i;
};

int main()
{
D d;
&(d.i);
}


--
;-)


Avatar
drkm
Fabien LE LEZ writes:

On Sun, 05 Dec 2004 01:32:46 +0100, drkm :

Pour commencer, j'interdirais l'héritage d'une classe qui contenait une
VLA.


Je n'arrive pas à trouver d'exemple précis de problème que cela
pourrait poser.


Il me semble que ceci suffirait à poser problème :

struct B
{
char tableau [*]; // Pas sûr de la syntaxe
};

struct D : B
{
int i;
};

int main()
{
D d;
&(d.i);
}


Quelle est la différence avec :

struct B
{
char tableau [*]; // Pas sûr de la syntaxe
int i;
};

int main()
{
B b;
&(b.i);
}

? Qui par ailleurs est du C.

--drkm



Avatar
Gabriel Dos Reis
drkm writes:

| "@(none)" <""kanze"@(none)"> writes:
|
| > Pour commencer, j'interdirais l'héritage d'une classe qui contenait une
| > VLA.
|
| Je n'arrive pas à trouver d'exemple précis de problème que cela
| pourrait poser. J'entrevois peut-être des problèmes avec l'héritage
| multiple, mais je ne connais pas assez le sujet pour trouver un
| exemple particulier.
|
| Tu as des exemples précis en tête ?

struct A {
int a[];
};

struct B : A {
};

-- Gaby
Avatar
Fabien LE LEZ
On Sun, 05 Dec 2004 06:10:20 +0100, drkm :

struct B
{
char tableau [*]; // Pas sûr de la syntaxe
int i;


Illégal, si j'en crois James : "Une VLA peut, par exemple, être le
dernier élément d'un struct."

--
;-)

Avatar
drkm
Fabien LE LEZ writes:

On Sun, 05 Dec 2004 06:10:20 +0100, drkm :

struct B
{
char tableau [*]; // Pas sûr de la syntaxe
int i;


Illégal, si j'en crois James : "Une VLA peut, par exemple, être le
dernier élément d'un struct."


Je viens de vérifier dans la norme. 6.7.2.1/2 dit :

A structure or union shall not contain a member with incomplete or
function type [...], except that the last member of a structure
with more than one named member may have incomplete array type;
such a structure (and any union containing, possibly recursively,
a member that is such a structure) shall not be a member of a
structure or an element of an array.

Il me semble que la transposition naturelle en C++ serait bien
d'interdir l'héritage : « such a structure [...] shall not be a member
of a structure ».

--drkm


Avatar
drkm
Gabriel Dos Reis writes:

drkm writes:

| Tu as des exemples précis en tête ?

struct A {
int a[];
};

struct B : A {
};


En regard de ma réponse à Fabien, ne serait-il pas évident
d'interdir cette construction ?

J'entrevois plus précisément les problèmes potentiels, je pense, et
la solution consistant à interdir que des structures contenant un VLA
soient un sous-objet d'une autre structure.

--drkm

Avatar
Fabien LE LEZ
On Sun, 05 Dec 2004 15:50:05 +0100, drkm :

En regard de ma réponse à Fabien, ne serait-il pas évident
d'interdir cette construction ?


Yep. D'autant que l'utilité d'introduire les VLA en C++, c'est la
compatibilité avec des headers écrits en C -- et de tels headers ne
risquent pas de parler d'héritage.

--
;-)

1 2 3 4