Giriş
Açıklaması şöyle
Şöyledir. & operatörünün olması ele alınmış
size_t tipindendir. Yani unsigned bir tiptir. Şöyle yaparız.
Örnek- union
Elimizde şöyle bir kod olsun. offsetof(U, m) her zaman 0 döner.
Elimizde şöyle bir struct olsun.
offsetof olmadan b alanına şöyle erişmek tanımsız davranışa sebep olur.
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üş tipisize_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- structElimizde şö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şmekoffsetof 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