2011-09-29 5 views
1

en utilisant GCC (Windows 32, C uniquement, options de construction par défaut).taille la plus locale utilisable localement

Quelle est la plus grande taille de ma pile locale ..?

par exemple:

void myfunc (void) 
{ 
char is_this_too_big_for_a_local_var[64*1024*1024]; 

somefunc(is_this_too_big_for_a_local_var); 
} 

peut-être d'une certaine expérience traumatisante au cours de mes premiers jours de codage, j'ai jamais tenté d'utiliser de plus en plus que dans la plupart 16k stockage local .. (oui, les habitudes cueillies up pendant les jours de 286, ordinateurs 16 bits) ..

Quoi qu'il en soit, localise vraiment de grandes variables localement OK? ou est-ce que quelques K restent la limite supérieure?

Répondre

3

Même si votre système a une grande pile, vous ne devriez pas avoir l'habitude de l'utiliser. Le code avec des cadres de pile volumineux devient problématique dès que vous souhaitez l'utiliser dans des programmes multithread, car la pile de chaque thread doit être suffisamment grande pour permettre l'utilisation de la pile la plus grande possible et le code créant le thread va utiliser pthread_attr_setstacksize (ou équivalent) pour éviter de dépenser plus d'espace d'adressage virtuel et de valider la charge que nécessaire sur chaque thread.

Edit: est ici une idée pour un « portable » (pour les systèmes POSIX) façon de vous assurer d'avoir l'espace que vous voulez sur la pile de votre fil conducteur:

  1. Au début principal, copiez argv à la mémoire nouvellement allouée.
  2. Puis créez un nouveau thread avec la taille de pile désirée, et passez-lui la copie de argv. Cela échouera et signalera l'erreur si la taille désirée n'est pas disponible.
  3. Dans le nouveau thread, invoquez à nouveau main avec le nouveau argv, mais avec un indicateur global défini pour éviter de répéter les étapes 1/2.
  4. pthread_exit du "thread principal" initial et de traiter votre nouveau thread comme le "thread principal".
Questions connexes