J'essayais d'utiliser une union pour que je puisse mettre à jour les champs dans un thread et ensuite lire allfields dans un autre thread. Dans le système actuel, j'ai des mutex pour m'assurer que tout est en sécurité. Le problème est avec fieldB, avant que je devais le changer fieldB a été déclaré comme champ A et C. Cependant, en raison d'un pilote tiers, fieldB doit être alligned avec la frontière de la page. Quand j'ai changé le champ B pour l'attribuer à valloc, je rencontre des problèmes.Question sur les syndicats et la mémoire allouée par tas
Questions: 1) Existe-t-il un moyen de déclarer statiquement fieldB alligned sur la limite de la page. Fondamentalement faire la même chose que valloc, mais sur la pile?
2) Est-il possible de faire une union quand le champ B, ou n'importe quel champ est alloué sur le tas ?. Je ne sais pas si c'est légal.
Voici un programme de test simple que j'expérimente. Cela ne fonctionne pas à moins que vous déclariez fieldB comme les champs A et C, et apporter les changements évidents dans les méthodes publiques.
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
class Test
{
public:
Test(void)
{
// field B must be alligned to page boundary
// Is there a way to do this on the stack???
this->field.fieldB = (unsigned char*) valloc(10);
};
//I know this is bad, this class is being treated like
//a global structure. Its self contained in another class.
unsigned char* PointerToFieldA(void)
{
return &this->field.fieldA[0];
}
unsigned char* PointerToFieldB(void)
{
return this->field.fieldB;
}
unsigned char* PointerToFieldC(void)
{
return &this->field.fieldC[0];
}
unsigned char* PointerToAllFields(void)
{
return &this->allFields[0];
}
private:
// Is this union possible with field B being
// allocated on the heap?
union
{
struct
{
unsigned char fieldA[10];
//This field has to be alligned to page boundary
//Is there way to be declared on the stack
unsigned char* fieldB;
unsigned char fieldC[10];
} field;
unsigned char allFields[30];
};
};
int main()
{
Test test;
strncpy((char*) test.PointerToFieldA(), "", 10);
strncpy((char*) test.PointerToFieldB(), "1234567890", 10);
strncpy((char*) test.PointerToFieldC(), "2345678901", 10);
char dummy[11];
dummy[10] = '\0';
strncpy(dummy, (char*) test.PointerToFieldA(), 10);
printf("%s\n", dummy);
strncpy(dummy, (char*) test.PointerToFieldB(), 10);
printf("%s\n", dummy);
strncpy(dummy, (char*) test.PointerToFieldC(), 10);
printf("%s\n", dummy);
char allFields[31];
allFields[30] = '\0';
strncpy(allFields, (char*) test.PointerToAllFields(), 30);
printf("%s\n", allFields);
return 0;
}
En fonction de votre appel à valloc il semble que vous voulez dire que la valeur contenue dans 'fieldB' doit être alignée la page. Est-ce correct? Quoi qu'il en soit, toute solution à laquelle je pense pourrait gaspiller jusqu'à PAGE_SIZE - 1 octet, ce qui représente beaucoup de pertes. Pourquoi voulez-vous l'attribuer sur la pile? – torak
Vous avez raison, fieldB doit être aligné sur la page. Je suppose qu'il n'y a pas besoin d'être alloué sur la pile. Je suis simplement curieux de savoir si c'est possible? Quand tout a été alloué sur la pile, cela semble fonctionner.Quand j'utilise valloc, j'ai un horrible crash. Si vous avez une solution où tout est sur le tas, j'ai ouvert à cela. –