Qt Creator – Calloc échoue avec une mémoire importante

J’ai un problème avec Qt Creator, ou l’un de ses composants.

J’ai un programme qui nécessite beaucoup de mémoire (environ 4 Go) et j’utilise calloc pour l’allouer. Si je comstack le code C avec mingw / gcc (sans utiliser le framework Qt), cela fonctionne, mais si je le comstack dans Qt Creator (avec le code C intégré dans le framework Qt utilisant C ++), à l’aide de la chaîne d’outils mingw / gcc , calloc renvoie un pointeur nul.

J’ai déjà recherché et trouvé l’option qt-pro QMAKE_LFLAGS += -Wl,--large-address-aware , qui fonctionnait dans certains cas (environ 3,5 Go), mais si je dépasse 4 Go, cela ne fonctionne qu’avec le code C compilé avec gcc, pas avec Qt.

Comment puis-je allouer la quantité de mémoire nécessaire à l’aide de calloc lors de la compilation avec Qt Creator?

    Donc, votre chaîne d’outils cigwin construit des applications 64 bits pour vous. La taille possible de la mémoire pouvant être allouée par une application 64 bits est de 2 64 octets, ce qui dépasse de loin les 4 Go. Mais Qt Creator (si vous l’avez installé à partir de QtSDK et ne l’a pas reconfiguré manuellement) utilise la chaîne d’outils de Qt, qui construit des applications 32 bits. Vous pouvez théoriquement allouer 4 Go de mémoire par application 32 bits, mais n’oubliez pas que toutes les bibliothèques seront également chargées dans cette mémoire. En pratique, il est possible d’allouer environ 3 Go de mémoire et non pas dans un bloc continu.

    Vous avez 3 façons de résoudre votre problème:

    • reconsidérer votre algorithme. N’allouez pas 4 Go de RAM, n’utilisez pas de structures de données plus intelligentes, ni de cache disque, etc. Je pense que si votre problème nécessitait plus de 4 Go de mémoire à résoudre, vous ne poseriez pas cette question.

    • séparez votre code Qt de votre programme C. Ensuite, vous pouvez toujours utiliser le compilateur cible 64 bits pour le programme C et le compilateur cible 32 bits pour le composant Qt / C ++. Vous pouvez communiquer avec votre programme C via n’importe quel mécanisme de communication interprocessus . (En réalité, les stream d’entrée / sortie standard suffisent souvent)

    • Déplacer vers 64 bits. Je veux dire, utiliser un compilateur cible 64 bits pour le code C et C ++. Mais ce n’est pas si simple, comme on pourrait le penser. Vous devrez reconstruire Qt en mode 64 bits. C’est possible avec certains modules désactivés et certaines corrections de code (j’ai déjà essayé), mais Windows 64 bits n’est pas officiellement supporté .