9
votes

Quelle est la différence entre Alloca (N) et Char X [N]?

Quelle est la différence entre xxx

et xxx

... où taille est une variable dont la valeur est inconnue au moment de la compilation.


5 commentaires

La réponse dépend de manière critique si taille une constante de temps de compilation. Est-ce?


Non, la taille est, à toutes fins utiles, un argument à la fonction


Ça n'a pas d'importance. Apple, par défaut, utilise - std = gnu99 qui prend en charge les deux. Alloca () est une extension GNU et le réseau de longueur variable est une fonctionnalité C99 compatible des normes.


@Matt B.Quelle a à voir Apple avec quelque chose?


@Billy: la question est marquée objectif-c . Je sais que le développement de Mac n'est pas la seule utilisation de l'OBJ-C, mais c'est l'application la plus probable de la langue. Mon point était que taille ne doit pas être constant avec C99 / GNU99 et qu'il s'agit d'un mode par défaut dans Xcode. Une correction mineure (légèrement non liée) à mon commentaire précédent serait S / pomme / xcode /.


6 Réponses :


17
votes

alloca () code> ne récupère pas la mémoire tant que la fonction actuelle se termine, tandis que la matrice de longueur variable récupère la mémoire lorsque le bloc actuel se termine.

Mettre un autre moyen: P>

void foo()
{
    size_t size = 42;
    if (size) {
        void *bytes1 = alloca(size);
        char bytes2[size];
    } // bytes2 is deallocated here
}; //bytes1 is deallocated here


3 commentaires

@Billy: la mémoire allouée par des octets de caractère [taille] n'est pas garantie physiquement pour être récupéré physiquement à la fin du bloc de courant; Cependant, l'accès après le bloc actuel n'est plus possible.


@Vlad: Techniquement, la standard C mentionne très peu lorsque les choses doivent être stockées physiquement pour éviter toute dépendance possible sur une architecture donnée. Cependant, même si quelque chose n'est pas dans la norme explicitement, la signification implicite de la norme entraîne 99,9% des compilateurs la mettant en œuvre de cette façon.


Bonne réponse Billy :). Aimé.



0
votes

dans la deuxième forme, taille doit être une constante connue pour compiler le temps.


1 commentaires

Peut-être, mais il est plus probable que l'OP consiste à faire référence à des tableaux de longueur variable, une partie de la norme C99.



6
votes

à partir du Documentation GNU :

L'espace alloué à Alloca existe jusqu'à ce que la fonction fonctionne retourne. L'espace d'un tableau de longueur variable est distribué dès que la superficie de la matrice termine se termine. (Si vous utilisez des tableaux de longueur variable et Alloca dans la même fonction, la répartition d'une matrice de longueur variable permettra également d'attribuer davantage de plus récemment attribués à Alloca.)

En outre, Alloca n'est pas une fonction C standard C, le support n'est donc pas garanti à tous les compilateurs. Les matrices de longueur variable font partie de la norme C99. N'importe quel compilateur de support C99 doit l'appliquer.


2 commentaires

Même s'il n'est pas pris en charge par votre compilateur, il existe généralement des versions de domaine public de alloca disponibles.


Les VLA ont été facultatifs en C11.



5
votes

Outre le point Billy mentionné, alloca n'est pas standard (ce n'est même pas en C99).


0 commentaires

0
votes

Outre les points déjà discutés de quand exactement l'espace est libéré et si la construction est soutenue du tout, il y a aussi ceci:

  • dans le boîtier alloca , octets a un type de pointeur.
  • dans le cas de [] cas, octets a un type de tableau.

    la différence la plus notable est dans ce que tailleof (octets) est; Pour un pointeur, il s'agit de la taille du pointeur ( tailleOf (vide *) ) alors que pour un tableau, il s'agit de la taille de l'espace alloué ( Tailleof (Char) * Taille , qui = taille pour ce cas depuis Tailleof (char) = 1).

    (également, dans votre exemple, les types d'éléments sont différents; pour être identique, le premier doit être remplacé par char * octets = alloca (taille) .) .


0 commentaires

0
votes

La plus grande différence est que l'alloca n'appelle pas de constructeurs ou detructeurs lorsque vous utilisez la mémoire comme variables de classe.

Les autres différences sont moins susceptibles d'être remarquées, mais peuvent devenir apparentes dans certaines erreurs de temps d'exécution étranges dans certaines situations.


0 commentaires