On aurait besoin des résultats renvoyés sur la sortie standard du programme suivant :
#include <stdio.h>
// On déclare différent type de variable
void aff(unsigned int adr, int sz)
{
printf("Pointeur %02d bits : %x -> %x align 32:",sz*8,adr,adr + sz -1);
if ((adr & 3)==0) printf("Yes"); else printf("No ");
printf(" align 64:");
if ((adr & 7)==0) printf("Yes"); else printf("No ");
printf("\n");
};
int main(void)
{
int t1;
short t2;
long t3;
long long t4;
char t5;
aff((unsigned long)&t1,sizeof(int));
aff((unsigned long)&t2,sizeof(short));
aff((unsigned long)&t3,sizeof(long));
aff((unsigned long)&t4,sizeof(long long));
aff((unsigned long)&t5,sizeof(char));
return 0;
};
Merci !
# Sortie standard
Posté par peck (site web personnel) . Évalué à -3.
Voila, c'est ce que tu avais demandé, content de t'avoir aidé.
# resultats processeurs serveurs
Posté par -=[ silmaril ]=- (site web personnel) . Évalué à 3.
Pointeur 32 bits : 527b80dc -> 527b80df align 32:Yes align 64:No
Pointeur 16 bits : 527b80da -> 527b80db align 32:No align 64:No
Pointeur 64 bits : 527b80d0 -> 527b80d7 align 32:Yes align 64:Yes
Pointeur 64 bits : 527b80c8 -> 527b80cf align 32:Yes align 64:Yes
Pointeur 08 bits : 527b80c7 -> 527b80c7 align 32:No align 64:No
AMD Opteron:
Pointeur 32 bits : ff81390c -> ff81390f align 32:Yes align 64:No
Pointeur 16 bits : ff81390a -> ff81390b align 32:No align 64:No
Pointeur 64 bits : ff813900 -> ff813907 align 32:Yes align 64:Yes
Pointeur 64 bits : ff8138f8 -> ff8138ff align 32:Yes align 64:Yes
Pointeur 08 bits : ff8138f7 -> ff8138f7 align 32:No align 64:No
j'ai pas de processeurs 64bits classe desktop (athlon/core2) ni d'itanium
donc je peut pas faire plus ;)
voili voilou
[^] # Re: resultats processeurs
Posté par NeoX . Évalué à 1.
Ubuntu Linux 6.10 version AMD64
# C'est pourtant simple...
Posté par Miod in the middle . Évalué à 3.
Le plus fréquemment recontré (et considéré comme le plus viable) est le modèle I32LP64, dans lequel un int fait 32 bits, et un long comme un pointeur font 64 bits. C'est le modèle utilisé par à peu près tous les Un*x sur 64 bits (dont Linux).
On a donc :
sizeof(int) = 4, aligné sur 4 octets
sizeof(long) = 8, aligné sur 8 octets.
La définition du type long long est plus "aléatoire" et pourra varier d'un système à l'autre ou d'une plate-forme à l'autre. En général on définit long long comme long, donc 8 octets.
De toute façon pour du code portable, on s'en fiche un peu. On sait que l'on a sizeof(int) <= sizeof(long) <= sizeof(long long), et que comme peu d'architectures apprécient les accès non alignés, qu'une variable de type long est forcément alignée à une adresse multiple de sizeof(long). Pas la peine de se coltiner des #define ou des valeurs magiques.
[^] # Re: C'est pourtant simple...
Posté par alf . Évalué à 1.
J'approuve.
Faux. On a "rangeof(int) <= rangeof(long) <= rangeof(long long)" où rangeof désigne le domaine de valeurs couverts par le type (et même "rangeof(char) <= rangeof(short) <= rangeof(int)").
Vicisieusement, la norme C ne spécifie rien sur les tailles des types entiers, si ce n'est que sizeof(char) == 1, et que sizeof(T) doit toujours renvoyer une valeur de type size_t (donc des valeurs entières, et pas 0,5 ou 2,75 par exemple).
Bon, après, en pratique, il ne doit y avoir qu'une DS9k pour avoir sizeof(int) > sizeof(long). Mais elle en a le droit, merci les bits de bourrage ;)
Idem aussi. Tant qu'on s'amuse avec les pointeurs et sizeof dans les limites de la norme, on s'en fiche de savoir si long est aligné sur 4 ou 8 octets...
# Remarques
Posté par alf . Évalué à 1.
Un cast d'un pointeur vers un type unsigned long n'est pas garanti par la norme, il peut y avoir des pertes. Par contre, le type uintptr_t (si je ne m'abuse, vérifie dans la norme) est fait pour convertir sans perte (ou avec le minimum de perte ?) une valeur entre les type pointeur et entier.
De plus, tu castes en unsigned long, alors que ta fonction attend un unsigned int...?
Par ailleurs, sizeof renvoie un size_t, et je ne croie pas que ce type ait forcément un domaine de valeurs inclut dans celui de int. Il pourraît être plus grand, si par exemple int fait 32 bits et qu'on peut allouer des objets dont la taille est plus grosse que 2^32 bits.
Ok, tu n'as montré ici qu'un code "juste pour tester", pas l'appli complète. Mais en te faisant les remarques ici, ça pourra peut-être éviter que les mêmes choses arrivent dans l'appli...
Pour compléter mon post juste au-dessus, je ne dis pas que connaître l'adressage et alignement mémoire n'est pas nécessaire dans ton cas, mais juste que, si tu peux arriver à coder ce que tu veux sans avoir à faire ce genre de tests, c'est plus sûr (et plus portable). Mais tu dois déjà être au courant...
# L'affaire est dans Lisaac.
Posté par Calim' Héros (site web personnel) . Évalué à 2.
processor : 0
vendor_id : AuthenticAMD
cpu family : 15
model : 35
model name : AMD Athlon(tm) 64 X2 Dual Core Processor 4400+
stepping : 2
cpu MHz : 1000.000
cache size : 1024 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 2
fpu : yes
fpu_exception : yes
cpuid level : 1
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt lm 3dnowext 3dnow pni lahf_lm cmp_legacy
bogomips : 2010.10
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management: ts fid vid ttp
processor : 1
vendor_id : AuthenticAMD
cpu family : 15
model : 35
model name : AMD Athlon(tm) 64 X2 Dual Core Processor 4400+
stepping : 2
cpu MHz : 1000.000
cache size : 1024 KB
physical id : 0
siblings : 2
core id : 1
cpu cores : 2
fpu : yes
fpu_exception : yes
cpuid level : 1
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt lm 3dnowext 3dnow pni lahf_lm cmp_legacy
bogomips : 2010.10
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management: ts fid vid ttp
~ $ gcc --version
gcc (GCC) 4.1.1 (Gentoo 4.1.1)
Copyright © 2006 Free Software Foundation, Inc.
Ce logiciel est libre; voir les sources pour les conditions de copie. Il n'y a PAS
GARANTIE; ni implicite pour le MARCHANDAGE ou pour un BUT PARTICULIER.
~ $ uname -a
Linux 2.6.18-gentoo-r1 #1 SMP PREEMPT Tue Oct 17 20:29:54 CEST 2006 x86_64 AMD Athlon(tm) 64 X2 Dual Core Processor 4400+ AuthenticAMD GNU/Linux
~ $ ./a.out
Pointeur 32 bits : 5c4fd51c -> 5c4fd51f align 32:Yes align 64:No
Pointeur 16 bits : 5c4fd51a -> 5c4fd51b align 32:No align 64:No
Pointeur 64 bits : 5c4fd510 -> 5c4fd517 align 32:Yes align 64:Yes
Pointeur 64 bits : 5c4fd508 -> 5c4fd50f align 32:Yes align 64:Yes
Pointeur 08 bits : 5c4fd507 -> 5c4fd507 align 32:No align 64:No
Note au passage :
CFLAGS/CXXFLAGS -march=k8 -O2 -pipe -fomit-frame-pointer
CHOST x86_64-pc-linux-gnu
# IBM RS6000 / Power3
Posté par Christophe Merlet (site web personnel) . Évalué à 2.
processor : 0
cpu : POWER3 (630+)
clock : 375.000000MHz
revision : 1.4 (pvr 0041 0104)
processor : 1
cpu : POWER3 (630+)
clock : 375.000000MHz
revision : 1.4 (pvr 0041 0104)
processor : 2
cpu : POWER3 (630+)
clock : 375.000000MHz
revision : 1.4 (pvr 0041 0104)
processor : 3
cpu : POWER3 (630+)
clock : 375.000000MHz
revision : 1.4 (pvr 0041 0104)
timebase : 93748329
platform : pSeries
machine : CHRP IBM,7044-270
# gcc --version
gcc (GCC) 4.1.2 20061028 (prerelease) (Debian 4.1.1-19)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# ./memalign
Pointeur 32 bits : ffd67a58 -> ffd67a5b align 32:Yes align 64:Yes
Pointeur 16 bits : ffd67a5c -> ffd67a5d align 32:Yes align 64:No
Pointeur 32 bits : ffd67a60 -> ffd67a63 align 32:Yes align 64:Yes
Pointeur 64 bits : ffd67a68 -> ffd67a6f align 32:Yes align 64:Yes
Pointeur 08 bits : ffd67a70 -> ffd67a70 align 32:Yes align 64:Yes
# HP DL385 / Bi Opteron 370
Posté par Christophe Merlet (site web personnel) . Évalué à 2.
processor : 0
vendor_id : AuthenticAMD
cpu family : 15
model : 33
model name : AMD Opteron(tm) Processor 270
stepping : 2
cpu MHz : 2000.000
cache size : 1024 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 2
fpu : yes
fpu_exception : yes
cpuid level : 1
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt lm 3dnowext 3dnow pni cmp_legacy
bogomips : 4009.39
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management: ts fid vid ttp
[x4]
# gcc --version
gcc (GCC) 4.1.1 20060525 (Red Hat 4.1.1-1)
Copyright © 2006 Free Software Foundation, Inc.
Ce logiciel est libre; voir les sources pour les conditions de copie. Il n'y a PAS
GARANTIE; ni implicite pour le MARCHANDAGE ou pour un BUT PARTICULIER.
# ./memalign
Pointeur 32 bits : 453a388c -> 453a388f align 32:Yes align 64:No
Pointeur 16 bits : 453a388a -> 453a388b align 32:No align 64:No
Pointeur 64 bits : 453a3880 -> 453a3887 align 32:Yes align 64:Yes
Pointeur 64 bits : 453a3878 -> 453a387f align 32:Yes align 64:Yes
Pointeur 08 bits : 453a3877 -> 453a3877 align 32:No align 64:No
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.