Comment allouer aligné à la mémoire qu'à l'aide de la bibliothèque standard?

Je viens de terminer un test dans le cadre d'une entrevue d'emploi, et une question sans réponse moi, même à l'aide de Google pour référence. J'aimerais voir ce que le StackOverflow l'équipage peut faire avec elle:

La memset_16aligned fonction nécessite une 16 octets aligné pointeur est passé, ou il va se planter.

a) Comment souhaitez vous allouer 1024 octets de mémoire, et d'aligner un 16 frontière d'octet?

b) libérer la mémoire après la memset_16aligned a exécuté.

{    
   void *mem;
   void *ptr;

   //answer a) here

   memset_16aligned(ptr, 0, 1024);

   //answer b) here    
}
  • hmmm...à long terme du code de la viabilité, comment au sujet de "le Feu celui qui a écrit memset_16aligned et de le réparer ou de le remplacer à ce qu'il n'a pas de limite particulière de la condition"
  • Certainement une bonne question à poser: "pourquoi l'étrange alignement de la mémoire". Mais il peut y avoir de bonnes raisons pour cela - dans ce cas, il se pourrait que la memset_16aligned() peut utiliser 128 bits entiers et c'est plus facile si la mémoire est connu pour être aligné. Etc.
  • Celui qui a écrit memset pourrait usage interne de 16 octets d'alignement pour la compensation de la boucle intérieure et un petit prologue/épilogue pour nettoyer les non-alignés se termine. Ce serait beaucoup plus facile que de faire des codeurs manipule des pointeurs de mémoire.
  • Juste malloc(1024);. Tous les malloc(3) implémentations sur les systèmes modernes sont déjà au moins ce aligné de toute façon.
  • Pourquoi quelqu'un voudrait-il des données alignées à 16 frontière d'octet? Probablement pour le charger dans 128 bits des registres SSE. Je crois que le (nouveau) non alignés movs (par exemple, movupd, lddqu) sont plus lents, ou peut-être qu'ils sont le ciblage des processeurs sans SSE2/3
  • L'alignement de l'adresse mène à l'optimisation de l'utilisation du cache, ainsi qu'à l'augmentation de la bande passante entre les différents niveaux de cache et la RAM (pour la plupart des charges de travail courantes). Voir ici stackoverflow.com/questions/381244/purpose-of-memory-alignment
  • Si il y a une justice dans le monde, la réponse est ptr=malloc_16aligned(1024); et free_16aligned(ptr) parce que quelqu'un qui écrit un utilisable de la bibliothèque doit fournir des services publics pour y accéder. NB: si malloc_16aligned(.) des appels à malloc(.) il a besoin d'ajouter une surcharge de sorte free_16aligned(ptr) peut annuler le décalage de ptr et appel gratuit(.).
  • Valide les cas d'utilisation pour exiger de 16 octets aligné mémoire lorsque vous souhaitez l'aide d'un code pour être capable de courir très vite sans avoir à faire des contrôles supplémentaires. Apple Métal graphiques-cadre (similaire à Vulkan) a cette exigence dans certains endroits que vous ne pouvez pas vraiment se plaindre, étant donné que le Métal est conçue pour les appareils avec un partage des CPU/GPU de la RAM (et donc, zéro-copie de transfert, de l'accès de verrouillage/déverrouillage et la mutation des mises à jour).

InformationsquelleAutor JimDaniel | 2008-10-22