6 Ağustos 2020 Perşembe

offsetof Macrosu

Giriş
Açıklaması şöyle
The macro offsetof expands to an integral constant expression of type std::size_t, the value of which is the offset, in bytes, from the beginning of an object of specified type to its specified member, including padding if any.
Elimizde bir struct olsun. offsetof(foo,b) ile b üye alanın kaçıncı byte'tan başladığını buluruz
struct Foo {
  float a, b;
};
Gerçekleştirim
Şöyledir. & operatörünün olması ele alınmış
#if defined _MSC_VER && !defined _CRT_USE_BUILTIN_OFFSETOF
  #ifdef __cplusplus
    #define offsetof(s,m) ((size_t)&reinterpret_cast<char const volatile&>((((s*)0)->m)))
  #else
    #define offsetof(s,m) ((size_t)&(((s*)0)->m))
  #endif
#else
    #define offsetof(s,m) __builtin_offsetof(s,m)
#endif
Dönüş tipi
size_t tipindendir. Yani unsigned bir tiptir. Şöyle yaparız.
size_t offset = offsetof(Foo, b);
Bazı kodlarda int'e atandığını görüyorum. Bu bence güzel değil.
int seeker = offsetof(Foo, field1);
Alana Erişmek 
Örnek- union
Elimizde şöyle bir kod olsun. offsetof(U, m) her zaman 0 döner.
union U {
  M m;
  ...
};
Örnek- struct
Elimizde şöyle bir struct olsun.
struct data
{
    int a, b, c;
};
b alanına erişmek için şöyle yaparız
struct data thing = { 0 };
char* p = ( char* )&thing + offsetof( thing , b );
int* b = ( int* )p;
*b = 123;
assert( thing.b == 123 );
offsetof Olmadan Alana Erişmek
offsetof olmadan b alanına şöyle erişmek tanımsız davranışa sebep olur.
struct data thing = { 0 };
char* p = (&thing.a)[1]
int* b = ( int* )p;
*b = 123;
assert( thing.b == 123 );



Hiç yorum yok:

Yorum Gönder