Portál AbcLinuxu, 10. května 2025 02:41

Dotaz: kontrola zarovnania adresy

14.3.2006 16:13 Michal Hocko | skóre: 7
kontrola zarovnania adresy
Přečteno: 163×
Odpovědět | Admin
Zdravim, neviete mi niekto poradit, co pouzit pre kontrolu, ci dany pointer odkazuje na spravne zarovnanu adresu?

Potrebujem aby to slo aspon na POSIX kompatibilnych systemoch.

Dakujem

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

14.3.2006 16:15 Michal Hocko | skóre: 7
Rozbalit Rozbalit vše Re: kontrola zarovnania adresy
Odpovědět | | Sbalit | Link | Blokovat | Admin
Zabudol som dodat, ze ide o ansi C.
14.3.2006 16:21 machr
Rozbalit Rozbalit vše Re: kontrola zarovnania adresy
Odpovědět | | Sbalit | Link | Blokovat | Admin
if((int)ptr % zarovnani == 0) { ...
14.3.2006 16:26 Michal Hocko | skóre: 7
Rozbalit Rozbalit vše Re: kontrola zarovnania adresy
a ak chcem, aby to bolo prenositelne, napr. Solaris 1, Solaris 2, HP-UX? Skor by som potreboval nejaku funkciu (makro), ktora tieto veci schova.
14.3.2006 16:40 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: kontrola zarovnania adresy
Nebyl bych si jistý, jestli to bude přenositelné, zejména na big endian architektury.
14.3.2006 18:11 machr
Rozbalit Rozbalit vše Re: kontrola zarovnania adresy
jo, to je pravda. pokud sizeof(int) != sizeof(void*) tak na big-endian by to asi nefungovalo...

idealni by bylo, kdyby existoval ciselnej typ, kterej je vzdy stejne velkej jako pointer. ale nikdy sem to nepotreboval, takze jestli existuje nevim...
14.3.2006 18:13 Michal Čihař | skóre: 61 | blog: Bláboly | Praha
Rozbalit Rozbalit vše Re: kontrola zarovnania adresy
Jmenuje se tuším intptr_t.
14.3.2006 18:25 machr
Rozbalit Rozbalit vše Re: kontrola zarovnania adresy
tak sem to zkousel a skutecne je to tak ;-)

je definovanej v souboru unistd.h, takze pokud to tazatel chce jako makro, tak staci napsat:
#include <unistd.h>

#define TEST_MEMORY_ALIGNMENT(p, a) ((intptr_t)(p) % (a) == 0)
a melo by to bejt prenositelny...
14.3.2006 18:34 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: kontrola zarovnania adresy
Ještě jedna poznámka: intptr_t není definován v <unistd.h> ale v <stdint.h>.
14.3.2006 19:04 machr
Rozbalit Rozbalit vše Re: kontrola zarovnania adresy
ale tenhle kod me prelozit sel:
#include <unistd.h>

int main(int argc, int argv) {
        intptr_t x = 0;
}
stejne jako tenhle:
#include <stdint.h>

int main(int argc, int argv) {
        intptr_t x = 0;
}
takze <unistd.h> mozna vklada <stdint.h>
14.3.2006 19:09 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: kontrola zarovnania adresy
Ano, <unistd.h> includuje <stdint.h>. Rozdíl je v tom, že zatímco hlavičkový soubor <stdint.h> je definován přímo standardem jazyka C, <unistd.h> je specifický pro posixové platformy.
15.3.2006 08:55 Michal Hocko | skóre: 7
Rozbalit Rozbalit vše Re: kontrola zarovnania adresy
Nejde o to, ako to definovat ako makro. To je trivialne, v momemente, ked je jasne, ake to zarovnanie skutocne je. Je mi jasne, ze taketo makro musi fungovat rovnakym alebo aspon podobnym sposobom.

Moj dotaz ale znel: existuje (kde je definovane) makro alebo funckia niekde v systemovych knizniciach, ktora to riesi. To znamena, ze nemusim mat plno ifdef pre rozne platformy, ktora sa celkom lisia.

Ak sa k tomu nedostanem, tak samozrejme definujem to makro samozrejme sam a budem musiet skumat, ako to je pre rozne platformy, z coho nie som velmi nadseny...

Kazdopadne ale dakujem za rady.

14.3.2006 18:32 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: kontrola zarovnania adresy
Ne úplně. U intptr_t je pouze garantováno, že konverze jakéhokoli pointeru na intptr_t a zpět zachová hodnotu (tj. že intptr_t je "dost velký, aby se do něj vešel pointer"). Což v důsledku de facto implikuje sizeof(intptr_t) >= sizeof(void*). Ale stejná velikost garantována není.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.