La définition du GUID dans l'en-tête Windows est comme ceci: Cependant, aucun emballage n'est défini. Étant donné que l'alignement des membres de la structure dépend de la mise en œuvre du compilateur, on pourrait penser que cette structure pourrait être de plus de 16 octets de taille. P> Si je peux supposer que c'est toujours 16 octets - mon code à l'aide des GUID est plus efficace et simple.
Cependant, il serait complètement dangereux - si un compilateur ajoute du rembourrage entre les membres pour une raison quelconque. P> Mes questions font des raisons potentielles? Ou est la probabilité du scénario que taille de (guid)! = 16 réellement 0. p> p>
6 Réponses :
Ce n'est pas zéro, cela dépend de votre système. Si l'alignement est Word (4 octets) basé, vous aurez un rembourrage entre le Si vous voulez être sûr qu'il est 16 - désactiver manuellement le rembourrage, utilisez sinon une taille court code> S et la taille sera supérieure à 16. p>
code> et ne supposez pas la valeur. P>
Je penserais aussi aussi. Cependant, mais cela ne devrait-il pas casser l'API Windows complète? surtout l'API RPC. (Quel Typedefs uuid en tant que GUID.)
@ JE42 - Non, car Windows API est sur un système afin que tout soit cohérent et que le RPC utilisera probablement le streaming ( NTOH code>,
Hton code> etc.).
Si ce serait une documentation officielle. Je pense que tout serait clair.
N'a pas d'importance.
Chaque fois que vous écrivez le code dépend de la taille de la structure de quelqu'un d'autre, Les cloches d'avertissement doivent partir. P>
Pourriez-vous donner un exemple de certains du code simplifié que vous souhaitez utiliser? La plupart des gens n'utiliseraient que Tailleof (GUID) si la taille de la structure était nécessaire. P>
avec cela dit - je ne peux pas voir la taille de la direction de la GUID. P>
Les éléments eux-mêmes peuvent ne pas changer, mais d'une plate-forme à une autre, la quantité de mémoire utilisée peut changer.
Si je pense que je dois faire une hypothèse comme celle-ci, je vais mettre une "assertion de temps de compilation" dans le code. De cette façon, le compilateur me laissera savoir si et quand je me trompe. P>
Si vous avez ou disposé à utiliser Boost, il y a un Pour mes propres fins, j'ai fait péputé la mienne (qui fonctionne en C ou C ++ avec MSVC, GCC et un compilateur intégré ou deux) qui utilise des techniques similaires à celles décrites dans cet article: P>
boost_stic_assert code> macro qui fait cela. P>
Oui, sur n'importe quel compilateur Windows. Sinon Notez que vous ne devez pas supposer des règles génériques C ou C ++ pour isequalguid code>
ne fonctionnerait pas: il se compare Seuls les 16 premiers octets. De même, toute autre fonction Winapi qui prend un GUID * code> vérifie simplement les 16 premiers octets. P>
windows.h code>. Par exemple, un octet est toujours de 8 bits sous Windows, même si ISO C permet 9 bits. P>
#include <stdio.h> #include <rpc.h> int main () { GUID myGUID; printf("size of GUID is %d\n", sizeof(myGUID)); return 0; } Got 16. This is useful to know if you need to manually allocate on the heap.
Qu'est-ce que tu en as à faire? Soyez toujours en sécurité et utilisez la taille de (). Tout d'abord, Tailleof () peut être évalué pour les compiler, et deuxièmement, ne vous attendez pas à rien vous-même s'il n'est pas explicitement spécifié. Depuis des siècles, les personnes attendues de 32 bits. Maintenant, il est à 64 bits sur la plupart des plates-formes et des pauses de code. Les gens attendaient de l'endanse et se demandent ensuite pourquoi les octets sont échangés. Mettez simplement, ne vous attendez pas.
La norme C ne définit pas la taille d'un pointeur.
La norme C ne définit pas la taille d'un pointeur. Toutefois, le RFC 4122 définit un GUID sous le nom de 128 bits. C'est pourquoi la question se pose. En outre, si vous regardez d'autres plates-formes, sur Linux / Mac Uuid sont définis sous forme de caractères 16Bytes. Je peux maintenant faire un compromis: rendre le code plus compliqué pour gérer le cas sizeof (GUID)! = 16 ou avoir un code facile. Dans un cas normal, je suis d'accord avec vous. Cependant, les GUID sont assez spéciaux. Le type est directement utilisé dans les structures RPC et ainsi de suite. La légère sous-spécification du type GUID dans les en-têtes en fait une affaire de frontière intéressante.
@Shi:
Tailleof code> ne peut pas garantir l'alignement, par exemple Pour SSE.
Que faites-vous que les comparaisons du GUID pourraient avoir un impact sur la performance sur votre code?
@jeffamphone: Si vous écrivez une plate-forme Wrapper indépendant autour du GUID. Vous pouvez simplement convertir le pointeur pour convertir de l'emballage au type GUID. Vous pouvez également retourner des références constantes. Ces choses nécessitent la même présentation de la mémoire.