2017-02-07 2 views
-1

J'ai une assez grande application MFC pour Windows que je construis avec Visual Studio en version 32 bits.Adresses en mémoire virtuelle pour l'application Windows 32 bits mfc.

Et j'ai une classe spéciale dans mon application qui a un membre d'index int. Cet index est toujours égal à l'adresse de cet objet dans la mémoire. Et tout fonctionne bien.

Cependant, maintenant j'ai besoin de déterminer un peu d'espace dans la mémoire virtuelle de mon application qui ne contiendra certainement pas d'objets de cette classe. Lorsque je les vois dans le débogueur, les valeurs d'intervalle ne sont généralement pas très faibles ou très élevées, mais elles ont une certaine valeur. Puis-je supposer que les adresses 0-10k (0x0000-0x2710) ne contiendront pas les objets de cette classe particulière? Et sinon, y a-t-il un autre espace d'adresse qui soit 'sûr'?

Ou s'il n'y a pas une telle chose alors peut-être que je peux allouer de la mémoire par moi-même pour avoir un 'pool' factice que je peux être sûr qu'aucun autre objet ne sera créé?

+0

créer un tas séparé, écraser 'operator new' pour cette classe et allouer ces objets à ce tas – RbMm

+2

Vous pouvez utiliser' VirtualAlloc (MEM_RESERVE) 'pour allouer de l'espace d'adressage. Rien ne va dans cet espace d'adresse sauf si vous l'avez mis là. Alternative: Windows ne placera aucun objet dans les 64 Ko inférieurs de la mémoire (0x0000 à 0xFFFF). Avant Windows 8, l'application pouvait tirer des astuces pour placer des objets manuellement, mais à partir de Windows 8, cela n'est pas autorisé. –

+0

Vous posez des questions sur la solution que vous proposez. Mais quel problème essayez-vous vraiment de résoudre? – IInspectable

Répondre

2

Ce système est tout horriblement spécifique, mais à condition que vous pouvez vivre avec cette limitation ...

  • 0 ne fonctionnera que si vous avez seulement besoin d'un seul élément.
  • Windows garantit de ne placer aucun objet dans les 64 premiers Ko de mémoire, donc toute valeur inférieure à 65536 est bonne. (Ajouté après commentaire par Raymond Chen).
  • Si votre code n'est pas compilé avec "grand espace mémoire", vous pouvez utiliser n'importe quelle adresse après 0x80000000. (Malheureusement, si est, bien qu'il y ait 1G réservé sur les plates-formes 32 bits, sur les plates-formes 64 bits votre programme n'a pas d'espace d'adressage réservé.)
  • Si vos données ont des exigences d'alignement (et si elles contiennent un 32 bits index, alors il est presque certainement aligné au moins 4 octets), alors toute valeur non alignée fonctionnera. En particulier, toute valeur impaire fonctionnera. (Encore une fois, ajouté après un commentaire de Raymond Chen).
+1

Autre option: Si l'objet a des exigences d'alignement, choisissez une valeur non alignée. –