6
votes

Puis-je assumer la taille de (guid) == 16 à tout moment?

La définition du GUID dans l'en-tête Windows est comme ceci: xxx

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.

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.

Mes questions font des raisons potentielles? Ou est la probabilité du scénario que taille de (guid)! = 16 réellement 0.


6 commentaires

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 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.


6 Réponses :


2
votes

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 court S et la taille sera supérieure à 16.

Si vous voulez être sûr qu'il est 16 - désactiver manuellement le rembourrage, utilisez sinon une taille et ne supposez pas la valeur.


2 commentaires

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 , Hton etc.).




1
votes

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.

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.

avec cela dit - je ne peux pas voir la taille de la direction de la GUID.


1 commentaires

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.




2
votes

Oui, sur n'importe quel compilateur Windows. Sinon isequalguid ne fonctionnerait pas: il se compare Seuls les 16 premiers octets. De même, toute autre fonction Winapi qui prend un GUID * vérifie simplement les 16 premiers octets.

Notez que vous ne devez pas supposer des règles génériques C ou C ++ pour windows.h . Par exemple, un octet est toujours de 8 bits sous Windows, même si ISO C permet 9 bits.


0 commentaires

0
votes
#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.

0 commentaires