Каков наилучший способ получить разницу адресов между переменной класса и начальным адресом объекта класса?

Необходимо создать уникальные ключи для членов класса данных. Поэтому я думаю о том, чтобы получить разницу между адресом переменной и адресом объекта класса. Например:

struct X {
int i;  // &i - &X() = 0  (GCC)
double d;  // &d - &X() = 8  (GCC)
};

Это одноразовое упражнение, и, следовательно, оно будет происходить в самом начале выполнения кода для всех заинтересованных классов. Поэтому, как правило, я объявляю фиктивный объект класса и нахожу разницу в адресах путем приведения типов. Такие как:

X x;
keyOf_i = long(&x.i) - long(&x);
keyOf_d = long(&x.d) - long(&x);

Есть ли лучший способ?
Предположим, что спецификатор доступа (private) не проблема.

Также будет интересно, если у кого-то есть другой подход к генерации уникальных ключей для переменных данных класса, кроме этого.


Обновить: С использованием offseof() макрос, я получаю следующее предупреждение в G ++ — 6:

смещение в типе нестандартной компоновки MyClass не определено

На самом деле у меня есть строка & другие переменные класса, а также внутри MyClass, Я в порядке, даже если эта неопределенная вещь дает уникальный адрес вообще. Тем не менее, хотел бы получить больше информации о offsetof() и другие альтернативы.

0

Решение

Как насчет использования макроса offsetof () для этого. Проверьте http://man7.org/linux/man-pages/man3/offsetof.3.html Больше подробностей.

Пример кода ниже со страницы руководства:

#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
struct s {
int i;
char c;
double d;
char a[];
};

/* Output is compiler dependent */

printf("offsets: i=%ld; c=%ld; d=%ld a=%ld\n",
(long) offsetof(struct s, i),
(long) offsetof(struct s, c),
(long) offsetof(struct s, d),
(long) offsetof(struct s, a));
printf("sizeof(struct s)=%ld\n", (long) sizeof(struct s));

exit(EXIT_SUCCESS);
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]